Rails没有重新加载会议上的Ajaxpost

我遇到了一个非常奇怪的问题,使用jQuery Rails和Ajax(虽然我不认为它是特定于jQuery)。

我的Rails应用程序使用cookie会话存储,我有一个非常简单的login,在会话中设置用户ID。 如果在会话中未设置user_id,则会redirect到login页面。 这工作没有问题。 JQuery GET请求也可以正常工作。 问题是当我做一个jQuery POST – 浏览器发送会话cookie ok(我确认这与萤火虫和转储request.cookies到日志),但会议是空白的,即会议是{}。

我在我的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'); 

这应该得到这个控制器方法(_method:删除):

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

查看日志并使用Firebug,我可以确认在ajax post发生时,在请求头中发送了正确的cookie值,但似乎在某些时候Rails丢失了这个值,因此会丢失会话,所以它redirect到login页面,永远不会去的方法。

我已经尝试了所有我能想到的方法来debugging,但是我想到了这可能是Rails中的一个错误。 如果有帮助,我使用Rails 3.0.4和jQuery 1.5。 我发现非常奇怪的是,定期(即非Ajax)获取和发布请求的工作,和Ajax请求工作没有问题,这只是阿贾克斯职位没有。

任何帮助,试图解决这个将不胜感激!

非常感谢,
戴夫

当我设法弄清楚发生了什么事的时候,我会回答自己的问题。 我会张贴在这里,以防其他人有用!

进一步调查后,我发现应该用CSRF标记设置请求标头的代码不是。 这是原来的代码:

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

发生了什么事是这个代码没有设置头,Rails接收到一个Ajax请求,令牌不匹配,它重置会话。 这用于引发一个ActionController :: InvalidAuthenticityToken错误(我想如果错误发生的话,我会在之前发现这个错误),但是由于Rails 3.0.4现在只是悄悄地重置会话。

所以要发送标题中的标记,你必须这样做(非常感谢这个奇妙的博客文章 ):

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

现在这一切都应该如此。 这很好。

我发现另一个案例:

你有没有在你的应用程序布局文件中设置“csrf_meta_tag”?

在我的情况下,我没有设置标签,并遇到了与您的问题。

在app / views / layouts / application.html.erb中设置csrf_meta_tag后,一切正常!

最后,谢谢你帮我find根源! 非常感谢〜

这就是官方jquery-ujs rails适配器在3.0系列中的作用。 不过,在升级rails版本时,必须记住保持更新。

对我来说,从3.0.3升级到3.0.8.rc4意味着还要从链接的仓库中手动获取src/rails.js文件。

由于Rails 3.1最终切换到了jQuery,因此在更新rails时(以及使用3.1的内置资产pipe道),将来会通过jquery-rails gem自动更新,