使用Devise在RoR中的会话超时消息

我有一个使用设计保护的应用程序和30分钟的会话超时。 使用设计一切都适用于正常导航,如果用户在超时时点击链接,他们会被重定向回登录屏幕,并显示“您的会话已过期,请再次登录以继续。”,非常好。

但是我在很多地方都有ajax。 如果会话超时并且用户执行了ajax操作,我想要与上面相同的行为,而不是在后台静默失败并出现401错误。

到目前为止,我在每个页面上都有这个jquery代码来捕获401并重新加载:

$(document).ajaxError(function(e, error) { switch(error.status) { case 401: { // unauthorised (possible timeout) location.reload(); break; } 

它运作良好,但有一个恼人的问题:

因为ajax请求首先命中设备,当我的应用程序重新加载页面时,我会被定向到登录页面,但是我没有看到超时消息,我看到未经身份validation的“您需要在继续之前登录或注册”。 信息。

有没有办法确保在第二个请求设计仍然显示超时消息?

我认为您需要手动显示此消息,例如通过重定向到特定URL或设置一些查询参数。

问题是,在你的401请求之后你得到了一个新的会话,当你重新加载浏览器时,下一个请求将以空会话命中你的应用程序。 这就是你获得未经身份validation的消息的原因。

xhr.responseText提供了超时消息“您的会话已过期。请再次登录以继续”,因此一种方法是显示:

 $(document).ajaxError(function(e, error) { switch(error.status) { case 401: { // unauthorised (possible timeout) location.reload(); alert(xhr.responseText); break; } 

对我而言,似乎流程更好:单击Ajax表单上的更新 ,获得会话超时的警报,然后在登录页面的闪存中看到“您需要登录或注册才能继续”。