Mensaje de tiempo de espera de sesión en RoR usando Devise

Tengo una aplicación asegurada con un dispositivo y un tiempo de espera de sesión de 30 minutos. Con el dispositivo, todo funciona bien para la navegación normal, si el usuario hace clic en un enlace cuando se agota el tiempo de espera, se le redirige de nuevo a la pantalla de inicio de sesión con un mensaje que dice “Su sesión expiró, vuelva a iniciar sesión para continuar”, excelente.

Sin embargo tengo ajax en muchos lugares. Si la sesión se agota y el usuario realiza una operación ajax, deseo el mismo comportamiento que el anterior, en lugar de fallar silenciosamente con un error 401 en segundo plano.

Hasta ahora tengo este código jquery en cada página para capturar 401s y volver a cargar:

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

Funciona bastante bien, pero hay un problema molesto:

Debido a que la solicitud de ajax golpea el dispositivo primero, cuando mi aplicación vuelve a cargar la página, me dirijo a la página de inicio de sesión, pero no veo el mensaje de tiempo de espera, veo el mensaje no autenticado “Debe iniciar sesión o registrarse antes de continuar”. mensaje.

¿Hay alguna manera de garantizar que en el segundo dispositivo de solicitud todavía se muestre el mensaje de tiempo de espera?

Creo que necesita mostrar este mensaje manualmente, por ejemplo, redirigiendo a una URL específica o configurando algún parámetro de consulta.

el problema es que, después de su solicitud 401, tiene una nueva sesión y cuando vuelve a cargar el navegador, la siguiente solicitud llegará a su aplicación con una sesión vacía. Por eso recibes el mensaje no autenticado.

El mensaje de tiempo de espera “Su sesión ha caducado. Por favor, vuelva a xhr.responseText sesión para continuar” está disponible en xhr.responseText , por lo que un enfoque sería simplemente mostrar que:

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

Para mí, esto parece fluir mejor: haga clic en Actualizar en un formulario Ajax, reciba una alerta de que la sesión ha expirado, luego vea “Debe iniciar sesión o registrarse antes de continuar” en la página de inicio de sesión.