ruby-on-rails - Rails 没有在 ajax post 上重新加载 session

标签 ruby-on-rails ajax jquery

我在使用 jQuery 时遇到 Rails 和 ajax 的一个非常奇怪的问题(尽管我不认为它是 jQuery 特有的)。

我的 Rails 应用程序使用 cookie session 存储,我有一个非常简单的登录,可以在 session 中设置用户 ID。如果 session 中未设置 user_id,它将重定向到登录页面。这没有问题。 JQuery GET 请求也可以正常工作。问题是当我执行 jQuery POST - 浏览器发送 session cookie 正常(我用 Firebug 确认了这一点并将 request.cookies 转储到日志)但是 session 是空白的,即 session 是 {}。

我在我的 application.js 中这样做:

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

这是我的示例帖子:

$.post('/test/1', { _method: 'delete' }, null, 'json');

应该到达这个 Controller 方法(_method:delete):

def destroy
  respond_to do |format|
    format.json { render :json => { :destroyed => 'ok' }.to_json }
  end
end

查看日志并使用 Firebug 我可以确认在发生 ajax post 时在请求 header 中发送了正确的 cookie 值,但似乎在某些时候 Rails 丢失了该值并因此丢失了 session ,因此它重定向到登录页面,永远不会到达该方法。

我已经尝试了所有我能想到的调试方法,但我逐渐意识到这可能是 Rails 中的错误。如果有帮助,我正在使用 Rails 3.0.4 和 jQuery 1.5。我发现常规(即非 ajax)get 和 post 请求有效,而 ajax get 请求正常工作,这很奇怪,只是 ajax post 没有。

如果您能帮助解决这个问题,我们将不胜感激!

非常感谢,
戴夫

最佳答案

我要回答我自己的问题,因为我已经设法弄清楚发生了什么。我会把它张贴在这里,以防它对其他人有用!

在进一步调查之后,我发现应该用 CSRF token 设置请求 header 的代码不是。这是原始代码:

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

发生的事情是这段代码没有设置 header ,Rails 正在接收 Ajax 请求, token 不匹配,它正在重置 session 。这曾经引发 ActionController::InvalidAuthenticityToken 错误(我想如果引发错误我会更早发现这个问题......哦好吧),但自从 Rails 3.0.4 以来它现在只是悄悄地重置 session 。

所以要在 header 中发送 token ,您必须这样做(非常感谢 this marvellous blog post ):

$.ajaxSetup({
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
  }
}); 

现在一切正常。这很好。

关于ruby-on-rails - Rails 没有在 ajax post 上重新加载 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5126721/

相关文章:

iphone - 从 iphone 应用程序将照片保存到 AWS S3

ruby-on-rails - #<User::ActiveRecord_Relation:0x007fdd1adb7a00> Rails 的未定义方法 `friendships'

ruby-on-rails - 使用 json 字段发布到 rails

javascript - rails : Restricting pure javascript in the asset pipeline to specific views

php - 如何通过 Ajax 获取 php 返回值?

javascript - JavaScript eval 的这种使用是否可以接受?

javascript - Jquery 下拉菜单。单击时子菜单消失。那么,如何让子菜单点击时保持不变呢?

ajax - 在 AJAX 调用 Laravel 后重定向到不同的 View

Javascript - 将字符串从某个字符拼接到下一个字符

jquery - 在 Superfish jQuery 菜单中显示所有子项