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

Chr*_*ris 5 authentication ajax ruby-on-rails devise ruby-on-rails-3

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

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

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

$(document).ajaxError(function(e, error) {
  switch(error.status) {

    case 401: {
      // unauthorised (possible timeout)
      location.reload();
      break;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

pho*_*oet 2

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

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