Ruby on rails 使用Desive的RoR中的会话超时消息

Ruby on rails 使用Desive的RoR中的会话超时消息,ruby-on-rails,ajax,ruby-on-rails-3,authentication,devise,Ruby On Rails,Ajax,Ruby On Rails 3,Authentication,Devise,我有一个用Desive保护的应用程序,会话超时30分钟。使用Desive all可以正常导航,如果用户在超时时单击链接,他们会被重定向回登录屏幕,并显示一条消息“您的会话已过期,请重新登录以继续”。非常好 然而,我在很多地方都有ajax。如果会话超时,用户执行ajax操作,我希望与上面相同的行为,而不是在后台出现401错误时默默失败 到目前为止,我在每页上都有这个jquery代码来捕获401并重新加载: $(document).ajaxError(function(e, error) { s

我有一个用Desive保护的应用程序,会话超时30分钟。使用Desive all可以正常导航,如果用户在超时时单击链接,他们会被重定向回登录屏幕,并显示一条消息“您的会话已过期,请重新登录以继续”。非常好

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

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

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

    case 401: {
      // unauthorised (possible timeout)
      location.reload();
      break;
    }
它工作得很好,但有一个恼人的问题:

因为ajax请求首先点击Desive,当我的应用程序重新加载页面时,我会被引导到登录页面,但我没有看到超时消息,我看到未经验证的“您需要登录或注册才能继续”消息


是否有办法确保Desive在第二次请求时仍显示超时消息?

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

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

超时消息“您的会话已过期。请重新登录以继续”在
xhr.responseText
中可用,因此一种方法是只显示以下内容:

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

    case 401: {
      // unauthorised (possible timeout)
      location.reload();
      alert(xhr.responseText);
      break;
    }
在我看来,这似乎更好:在Ajax表单上单击Update,获取会话超时的警报,然后在登录页面的flash中查看“您需要登录或注册才能继续”