2011-03-09 2 views
9

J'ai une situation dans laquelle un lien particulier génère un hachage de session vide. Ce n'est pas bon car j'ai besoin de trouver un modèle en utilisant l'identifiant session_id.La session Rails est vide lorsque vous utilisez HTTP put

Le lien qui pose problème est:

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

et le code qui trouve le modèle de l'identifiant de session (qui est appelée à l'aide d'un before_filter):

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

En mode de débogage, Si je change le link_to pour être un 'get' HTTP au lieu de 'put', la session est envoyée. Cependant, cette requête n'est pas appropriée pour un 'get' car il s'agit de modifier des données. Pourquoi "get" inclure la session, mais "put" pas?

+1

Je pense que vous devez donner plus d'informations. Seule cette méthode link_to n'est pas suffisante. – Ashish

+0

J'ai ajouté les informations sur get vs put. Quelles autres informations pourraient aider? – Cam

Répondre

9

D'accord, je l'ai trouvé. Comme le lien est un http-put, les rails n'incluent pas automatiquement le jeton d'authenticité, comme c'est le cas avec un http-get. Ainsi, en passant le jeton d'authenticité en paramètre, les rails reconnaissent la session.

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

Cette page m'a aidé en trébuchant sur cette solution: http://www.kolodvor.net/2010/01/02/rails-csrf-and-ajax-requests/

+0

J'ai le même problème. Le fichier rails.js (jquery) n'incluait pas le jeton dans chaque instance, ce qui causait des problèmes. https://gist.github.com/865699 – sandstrom

+0

Excellent, merci vlado et vous! – bonyiii

+0

Devons-nous passer l'authenticity_token en plus du X-CSRF-Token? – Ziggy

1

Il arrive si vous avez oublié d'ajouter <%= csrf_meta_tags %> à votre disposition. Ajoutez-le comme

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

Il s'agit en fait de <% = csrf_meta_tag%> – Sean

1

Cela est dû à la protection CSRF dans Rails. Voir this security patch notification

Pour résoudre définitivement ce problème, suivez les instructions sur le lien ci-dessus. Les dernières versions de rails.js ont été corrigées pour ajouter le paramètre authenticity_token à toutes les requêtes AJAX générées par Rails.

Si vous mettez à niveau une version antérieure de Rails, vous devrez peut-être inclure csrf_meta_tag dans votre mise en page comme suggéré par Vikrant Chaudhary.

Questions connexes