2011-02-26 20 views
60

我遇到了一个非常奇怪的问题与Rails和Ajax使用jQuery(虽然我不认为它是特定于jQuery)。Rails没有重新加载会话在AJAX后

我的Rails应用程序使用cookie会话存储,我有一个非常简单的登录,它在会话中设置用户标识。如果user_id未在会话中设置,则会重定向到登录页面。这工作没有问题。 JQuery GET请求也可以正常工作。问题是当我做jQuery POST时 - 浏览器发送会话cookie正常(我用Firebug确认了这一点,并将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 

寻找和使用萤火虫,我可以确认正确的cookie值在请求他送当ajax文章发生时,但似乎在某些时候Rails失去了这个值,因此失去了会话,所以它重定向到登录页面并且永远不会到达该方法。

我已经试过了所有我能想到的调试方法,但是我想到了这可能是Rails中的一个错误。如果有帮助,我使用Rails 3.0.4和jQuery 1.5。我发现非常奇怪的是,定期(即非Ajax)获取和发布请求的工作,并且Ajax获取请求没有问题,它只是没有问题的ajax帖子。

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

非常感谢,
戴夫

回答

112

我要回答我的问题,我已经成功地制定出了事情的原委。我会在这里发布它,以防其他人有用!

经过进一步调查,我发现代码假设是用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现在只是悄悄地重置会话。

因此,要发送的令牌头,你必须要做到这一点(很多感谢this marvellous blog post):

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

现在,这一切的作品,因为它应该。这很好。

0

这就是official jquery-ujs rails adapter适用于3.0系列。不过,在升级rails版本时,必须记住保持更新。

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

由于Rails的3.1更新时轨(使用3.1内置的资产管道)

5

我发现了另一个终于切换到了jQuery的,事情应该在通过jQuery的轨道宝石未来的自动更新case:

你在应用程序布局文件中设置了'csrf_meta_tag'吗?

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

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

最后,感谢您帮助我找到根源!非常感谢〜

+0

此标签已被'csrf_meta_tags' – ChrisW 2016-01-28 10:00:50