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".