我在Rails和jQuery下遇到一个非常奇怪的问题(尽管我认为这并不特定于jQuery)。
我的Rails应用程序使用cookie会话存储,并且我有一个非常简单的登录功能,它将用户ID设置在会话中。如果在会话中没有设置user_id,则重定向到登录页面。这是没有问题的。JQuery的GET请求也能正常工作。问题出现在我进行jQuery的POST请求时——浏览器会发送会话cookie(我用Firebug确认了这一点,并将请求.cookies转储到日志中),但会话是空的,即session is {}。
我在我的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: delete):
def destroy
respond_to do |format|
format.json { render :json => { :destroyed => 'ok' }.to_json }
end
end
通过查看日志和使用Firebug,我可以确认在ajax提交发生时正确的cookie值已发送到请求头部,但似乎在某个时刻Rails丢失了这个值,因此丢失了会话,所以它重定向到登录页面并永远无法达到该方法。
我已经尝试了我所能想到的一切来调试这个问题,但我现在越来越认为这可能是Rails中的一个错误。如果有帮助的话,我正在使用Rails 3.0.4和jQuery 1.5。我发现很奇怪的是常规的(即非ajax)get和post请求工作正常,ajax get请求也没有问题,只有ajax post请求出现问题。
任何帮助修复此问题的意见都将不胜感激!
非常感谢,
Dave