2011-03-09 7 views
9

Tengo una situación en la que un enlace en particular da como resultado un hash de sesión vacío. Esto no es bueno ya que necesito encontrar un modelo usando el session_id.La sesión de Rails está en blanco al usar HTTP put

El enlace que está causando problemas es:

<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> 

y el código que se encuentra el modelo desde el identificador de sesión (que se llama usando un before_filter):

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

En el modo de depuración, session == {}

Si cambio el link_to para que sea un HTTP 'get' en lugar de 'put', se envía la sesión. Sin embargo, esta solicitud no es apropiada para un 'get' porque está modificando los datos.

¿Por qué 'get' incluiría la sesión, pero 'put' not?

+1

Creo que tiene que dar más información. Solo este método link_to no es suficiente. – Ashish

+0

Agregué la información sobre get vs put. ¿Qué otra información ayudaría? – Cam

Respuesta

9

Ok, lo encontramos. Como el enlace es un http-put, rails no incluye automáticamente el token de autenticidad, como lo hace con un http-get. Entonces, pasando el token de autenticidad como un param, Rails reconoce la sesión.

<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> 

Esta página me ayudó en tropezar con esta solución: http://www.kolodvor.net/2010/01/02/rails-csrf-and-ajax-requests/

+0

Tiene el mismo problema. El archivo rails.js (jquery) no incluía el token en cada instancia que debería, lo que causó algunos problemas. https://gist.github.com/865699 – sandstrom

+0

Excelente, gracias vlado y tu! – bonyiii

+0

¿Tenemos que pasar la autenticidad_token además del X-CSRF-Token? – Ziggy

1

Ocurre si se olvidó de añadir <%= csrf_meta_tags %> a su disposición. Añadir ella como

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

En realidad es <% = csrf_meta_tag%> – Sean

1

Esto es causado por la protección CSRF en Rails. Ver this security patch notification

Para solucionar este problema permanentemente, siga las instrucciones del enlace de arriba. Las últimas versiones de rails.js han sido parcheadas para agregar el parámetro authenticity_token a todas las solicitudes AJAX generadas por Rails.

Si está actualizando una versión anterior de Rails, es posible que deba incluir csrf_meta_tag en su diseño según lo sugerido por Vikrant Chaudhary.

Cuestiones relacionadas