2011-03-09 5 views
9

하나의 특정 링크로 인해 빈 세션 해시가 발생하는 상황이 있습니다. session_id를 사용하여 모델을 찾아야하므로 좋지 않습니다. 문제의 원인이되는 링크HTTP를 사용할 때 Rails 세션이 비어 있습니다.

은 다음과 같습니다

<div id="marker_images"> 
    <% @marker_image_urls.each do |image_url| %> 
    <%= link_to(image_url, 
       location_type_path(@location_type.id, 
       :location_type => {:preset_marker_url => image_url}), 
       :method => :put, 
       :remote => true) %> 
    <% end %> 
</div> 

및 (A before_filter를 사용하여 호출한다) 세션 ID의 모델을 발견 코드 : 디버거 모드에서

def get_organisation 
    @organisation = Organisation.find_by_session_id(session[:session_id]) 
end 

을, session == {}

link_to를 'put'대신 HTTP 'get'으로 변경하면 세션이 전송됩니다. 그러나이 요청은 데이터를 수정하기 때문에 'get'에 적합하지 않습니다.

'가져올'세션을 포함하지만 '넣기'가 아닌 이유는 무엇입니까?

+1

더 많은 정보를 제공해야한다고 생각합니다. 이 link_to 메소드만으로는 충분하지 않습니다. – Ashish

+0

get vs put에 대한 정보를 추가했습니다. 다른 어떤 정보가 도움이 될까요? – Cam

답변

9

좋아, 찾았습니다. 링크가 http-put이기 때문에 레일스는 http-get과 마찬가지로 인증 토큰을 자동으로 포함하지 않습니다. 따라서 진위도 토큰을 매개 변수로 전달하면 레일스가 세션을 인식합니다.

<div id="marker_images"> 
    <% @marker_image_urls.each do |image_url| %> 
    <%= link_to(image_tag(image_url), 
       location_type_path(@location_type.id, 
            :location_type => {:preset_marker_url => image_url}, 
            :authenticity_token => form_authenticity_token), 
       :method => :put, 
       :remote => true) %> 
    <% end %> 
</div> 

이 페이지

이 솔루션에 걸림돌 저를 도와 : 당신이 당신의 레이아웃에 <%= csrf_meta_tags %>을 추가 잊어 버린 경우 http://www.kolodvor.net/2010/01/02/rails-csrf-and-ajax-requests/

+0

같은 문제가 발생했습니다. rails.js (jquery) 파일에는 필요한 모든 인스턴스에 토큰이 포함되어 있지 않아 일부 문제가 발생했습니다. https://gist.github.com/865699 – sandstrom

+0

우수, vlado와 당신에게 감사하십시오! – bonyiii

+0

X-CSRF-Token과 함께 authenticity_token을 전달해야합니까? – Ziggy

1

그것은 발생합니다. 그것을 추가하십시오

<head> 
    <%= csrf_meta_tags %> 
</head> 
+0

실제로는 <% = csrf_meta_tag %> – Sean

1

이것은 Rails의 CSRF 보호 때문입니다. this security patch notification

이 문제를 영구적으로 해결하려면 위 링크의 지침을 따르십시오. rails.js의 최신 버전은 Rails에 의해 생성 된 모든 AJAX 요청에 authenticity_token 매개 변수를 추가하도록 패치되었습니다.

레일스의 초기 버전을 업그레이드하려면 Vikrant Chaudhary가 제안한대로 csrf_meta_tag을 레이아웃에 포함해야 할 수도 있습니다.

관련 문제