ruby-on-rails - entre - routes in ruby on rails
Hacer correctamente redirect_to: volver a Ruby on Rails cuando el referente no está disponible (7)
Tengo un problema con redirect_to :back
. Sí, son referencias.
A menudo recibo la excepción
(ActionController :: RedirectBackError) "No se estableció HTTP_REFERER en la solicitud de esta acción, por lo que redirect_to: back no se pudo invocar con éxito. Si se trata de una prueba, asegúrese de especificar request.env [/" HTTP_REFERER / "]."
Me doy cuenta de que esto es el resultado de que un referente no esté disponible. ¿Hay alguna manera de que, por ejemplo, uno pueda establecer una variable de sesión en cada acceso con la última página visitada, y cuando HTTP_REFERER no esté disponible, utilice esta variable de sesión para redirigir a?
Aquí está mi pequeño método redirect_to_back:
def redirect_to_back(default = root_url)
if request.env["HTTP_REFERER"].present? and request.env["HTTP_REFERER"] != request.env["REQUEST_URI"]
redirect_to :back
else
redirect_to default
end
end
Puede pasar una url opcional para ir a otro lugar si http_refferrer está en blanco.
Es poco probable que tenga una sesión y no tenga una referencia.
La situación en la que no se establece un referente no es poco común y por lo general rescato esa expectativa:
def some_method
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to root_path
end
Si haces esto a menudo (lo que creo que es una mala idea) puedes envolverlo en otro método como sugiere Maran.
Por cierto, creo que es una mala idea porque esto hace que el flujo de usuarios sea ambiguo. Solo en el caso de un inicio de sesión esto es sensato.
ACTUALIZACIÓN : Como señalaron varias personas, esto ya no funciona con Rails 5. En su lugar, use redirect_back
, este método también es compatible con un respaldo. El código luego se convierte en:
def some_method
redirect_back fallback_location: root_path
end
Quizás es tarde, pero me gustaría compartir mi método, que también conserva las opciones:
def redirect_back_or_default(default = root_path, *options)
tag_options = {}
options.first.each { |k,v| tag_options[k] = v } unless options.empty?
redirect_to (request.referer.present? ? :back : default), tag_options
end
Puedes usarlo como:
redirect_back_or_default(some_path, :notice => ''Hello from redirect'', :status => 301)
Recientemente, me encontré con el mismo problema en el que tuve que redirigir :back
o a una página específica. Después de ir a mucha solución, finalmente encontré esto que es simple y parece resolver el problema:
if request.env["HTTP_REFERER"].present?
redirect_to :back
else
redirect_to ''specific/page''
end
Si desea utilizar session
detalles de la session
, hágalo en la parte else del código.
similar a la respuesta de @ troex, agregue esto a su controlador de aplicación
def redirect_back_or_default(default = root_path, options = {})
redirect_to (request.referer.present? ? :back : default), options
end
luego úsalo en tu controlador
redirect_back_or_default answer_path(answer), flash: { error: I18n.t(''m.errors'')}
Característica principal
redirect_back
es una función principal de Rails 5+, está disponible en el módulo ActionController::Redirecting
que ya está incluido en ApplicationController::Base
.
ADVERTENCIA DE DEPRESIÓN:
redirect_to :back
está en desuso y se eliminará de Rails 5.1. Utiliceredirect_back(fallback_location: fallback_location)
ubicación_de_defensa: ubicación_de_defensaredirect_back(fallback_location: fallback_location)
donde ubicación_de_detrás representa la ubicación que se utilizará si la solicitud no tiene información de referencia de HTTP.
EDITAR: source
def store_location
session[:return_to] = request.request_uri
end
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end
¡Trata eso! (Gracias al plugin Authlogic )