ruby-on-rails redirect devise http-status-codes http-status-code-401

ruby on rails - Ruby-on-Rails: cómo deshacerse de la página de "estás siendo redirigido"



redirect devise (4)

Como dijo @pantulis, el navegador mostrará este mensaje estándar si el código de respuesta no es un 3xx

Para solucionar esto, puede realizar una redirección de javascript:

# example with status 500: render text: "<script>window.location = ''#{url}'';</script>", status: 500

Esto es válido fuera de curso solo si está seguro de que todos sus usuarios están usando javascript. Si los usuarios que pueden haber deshabilitado javascript pueden noscript su aplicación, también debe incluir una etiqueta noscript y una alternativa en el mensaje estándar "Está siendo redirigido"

Estoy anulando la respuesta de falla de Devise para poder establecer un código de estado 401. Sin embargo, cuando el usuario no puede iniciar sesión, se le redirige a una página con un enlace "se le está redirigiendo". Si elimino esto :status => 401 de la redirección funciona bien.

class CustomFailure < Devise::FailureApp def redirect_url new_user_session_url(:subdomain => ''secure'') end def respond if http_auth? http_auth else store_location! flash[:alert] = i18n_message unless flash[:notice] redirect_to redirect_url, :status => 401 end end end

editar

Alternativamente, me gustaría mostrar el mensaje flash y permanecer en la misma página pero agregando esta línea de código:

render :text => "unauthorized", :status => 401

hace que el rubí se queje:

undefined method `render'' for #<CustomFailure:0x00000103367f28>

¿Que esta pasando aqui?


Cuando tengo este problema, lo que he hecho en el pasado es algo como esto:

#app/controllers/application_controller.rb class ApplicationController < ActionController::Base after_filter :check_page_content ... private def check_page_content if response.body.include? "You are being" html_doc = Nokogiri::HTML(response.body) uri = html_doc.css(''a'').map { |link| link[''href''] }.first response.body = "<script> window.location.replace(''#{uri}''); </script>" end end end

Lo que estoy haciendo es verificar si el contenido de la página es "Estás siendo". Si esto es cierto, sé que no estoy donde quiero estar. y acabo de actualizar la página donde realmente quiero estar con un poco de ayuda de Javascript. Sé que no es la solución más elegante, pero realmente ayuda

Feliz hacking


En realidad, me encontraba con este problema en nuestro servidor de control de calidad, pero no localmente. Resultó que nuestro memcache estaba interceptando el mensaje y representándolo como un 200, y haciendo que este mensaje aparezca. Esto se debió indirectamente a nuestra configuración de memcache que no esperaba una re-dirección de un GET.

From: $document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @memcached To: $document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @rails


Los estados HTTP adecuados para una redirección están en la forma 30x (301 y 302 son los más utilizados). De forma predeterminada, redirect_to helper establece un encabezado de estado 302 en la respuesta HTTP. Si lo reemplaza y lo configura en un 401, su navegador web asumirá que la respuesta es una página web normal y mostrará el cuerpo de la respuesta, que, en una redirección, es el texto de la caldera "Se está redirigiendo".