使用HTTP put时,Rails会话为空

我有一种情况,一个特定的链接导致一个空的会话哈希。 这不好,因为我需要使用session_id来查找模型。

导致麻烦的链接是:

{:preset_marker_url => image_url}), :method => :put, :remote => true ) %>

以及从会话ID中找到模型的代码(使用before_filter调用):

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

在调试器模式下, session == {}

如果我将link_to更改为HTTP“get”而不是“put”,则会发送会话。 但是,此请求不适合’get’,因为它正在修改数据。

为什么“得到”包括会话,但“放”不是?

好的,找到了。 由于链接是http-put,因此rails不会自动包含真实性令牌,因为它与http-get一样。 因此,通过将真实性令牌作为参数传递,rails会识别会话。

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

这个页面帮助我找到了解决这个问题的方法: http : //www.kolodvor.net/2010/01/02/rails-csrf-and-ajax-requests/

如果您忘记将<%= csrf_meta_tags %>到布局中,就会发生这种情况。 像它一样添加它

  <%= csrf_meta_tags %>  

这是由Rails中的CSRF保护引起的。 请参阅此安全补丁通知

要永久解决此问题,请按照上述链接中的说明操作。 最新版本的rails.js已经过修补,可以将authenticity_token参数添加到Rails生成的所有AJAX请求中。

如果要升级Rails的早期版本,则可能需要在Vikrant Chaudhary建议的布局中包含csrf_meta_tag