2014-04-10 1 views
0

터보 링크를 사용할 때 간단한 클릭 이벤트로 컨트롤러 동작에 데이터를 전송하는 "레일 웨이"란 무엇입니까?레일 웨이 : 터보 링크를 사용하여 컨트롤러에 클라이언트 데이터 보내기

두 개의 링크가있는 페이지가 있는데 하나는 /food이고 다른 하나는 /drinks입니다. 내 목표는 일부 위치 데이터를 (geolocation API를 통해) 컨트롤러에 보내고 해당 위치 데이터를 처리 한 후 적절한보기를 렌더링하는 것입니다.

사용자를 적절한 경로로 이동하고 요청과 함께 데이터를 전송하는 가장 적은 저항 경로는 무엇입니까?

각 단추를 양식으로 묶어서 게시 요청을 보내야합니까?

Turbolinks를 도용/해제하고 자체적으로 렌더링을 관리해야합니까? 클릭 이벤트에서 XHR을 통해 데이터를 전송하는 경우 컨트롤러는 개의 요청을 수신합니다. 하나는 터보 링크이고 다른 하나는 내 처리기로, 이는 바람직하지 않습니다.

응용 프로그램/컨트롤러/drinks_controller.rb

class DrinksController < ApplicationController 
    def index 
    # Ideally, I would like to check for POST or GET data here 
    # and send as a parameter to get_a_venue 

    @venue = get_a_venue(:drinks) 
    end 
end 

응용 프로그램/뷰/음료/index.html.erb

<% provide(:title, @venue[:name]) %> 

<!-- body content --> 

<div class="row buttons"> 
    <div class="small-12 medium-6 columns"> 
     <h3> 
      <%= link_to 'Try Another One', drinks_path, class: "button expand radius choice" %> 
     </h3> 
    </div> 
    <div class="small-12 medium-6 columns"> 
     <h3> 
      <%= link_to "I Want Some Food Instead", food_index_path, class: "button expand radius choice" %> 
     </h3> 
    </div> 
</div> 

: 여기

몇 가지 코드 앱/에셋/javascripts/handlers.js

$(function() { 
    // success callback sets an in scope variable to the location coordinates 
    navigator.geolocation.getCurrentPosition(success, error, options) 

    document.addEventListener('click', function(e) { 
     if (e.currentTarget.nodeName === 'A' && 
      e.currentTarget.classList.contains('choice') { 

      // send data via ajax here? 
     } 
    }, false) 
})() 

답변

2

예를 들어 opt-out 버튼을 사용하면 버튼이 터보 링크를 사용할 수 없습니다.

또는 page:before-change 이벤트를 수신하고 AJAX 요청을 수행 한 다음 false를 반환 할 수 있습니다. 그러면 터보 링크 요청이 취소됩니다. Source

그래서 뭔가 같은 :

document.addEventListener('page:before-change', function(e) { 
    if (e.currentTarget.nodeName === 'A' && 
     e.currentTarget.classList.contains('choice') { 
    // do stuff 
    } 
    return false; 
}, false) 

경우 싶어 사용 turbolinks하지만 link_to "something", something_path(lat: <geolat>, lng: <geolng>) 다음은 params[:lat]으로, 위도 LNG에 액세스 할 수있는 컨트롤러에 쿼리 문자열로 위치 정보를 제공 params[:lng]

+0

시원한. 따라서 터보 링크를 사용하지 말고'render' 또는'redirect_to'를 사용하여 컨트롤러에서 페이지 변경을 처리하는 것이 가장 좋은 방법이라고 생각하십니까? –

+0

터보 링크를 활성화하려면 'link_to'를 사용하십시오. 업데이트 된 답변보기 – drowzy

+0

링크 클릭과 독립적으로 POST 요청을 보냈습니다. 따라서 사용자가 도착하면 지리 데이터를 가져 와서 데이터를 세션 변수로 저장하는 컨트롤러 메소드로 보냅니다. 여전히 터보 링크를 사용할 수 있으며 페이지간에 데이터가 지속됩니다. –