ruby-on-rails - redirect_to - render redirect rails
¿Cómo redirigir a la página anterior en Ruby On Rails? (7)
¿Por qué redirect_to(:back)
no funciona para usted, por qué es un no ir?
redirect_to(:back)
funciona como un encanto para mí. Es solo un atajo para redirect_to(request.env[''HTTP_REFERER''])
http://apidock.com/rails/ActionController/Base/redirect_to (pre Rails 3) o http://apidock.com/rails/ActionController/Redirecting/redirect_to (Rails 3)
Tenga en cuenta que redirect_to(:back)
está en desuso en Rails 5. Puede usar
redirect_back(fallback_location: ''something'')
lugar (ver http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )
Tengo una página que enumera todos los proyectos que tienen encabezados y paginación clasificables.
path:
/projects?order=asc&page=3&sort=code
Elijo editar uno de los proyectos
path:
projects/436/edit
Cuando hago clic en guardar en esa página, se llama al controlador del proyecto / método de actualización. Después de actualizar el código que quiero redirigir a la ruta en la que estaba antes de hacer clic en editar un proyecto específico. En otras palabras, quiero estar en la misma página con la misma clasificación.
Vi link_to (: back) y pensé que: back puede funcionar en redirect_to (: back), pero eso es un no ir.
puts YAML::dump(:back)
yields the following:
:back
Alguna idea sobre cómo podría hacer que esto funcione. Parece un problema que se resolvería fácilmente, pero soy nuevo en RoR.
Así es como lo hacemos en nuestra aplicación
def store_location
session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
end
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
end
De esta forma, solo almacena la última solicitud GET en :return_to
param de sesión, por lo que todos los formularios, incluso cuando funcione con múltiples horas de POSTed :return_to
.
En los rieles 5, según las instrucciones de Rails Guides, puede usar:
redirect_back(fallback_location: root_path)
La ubicación ''posterior'' se extrae del encabezado HTTP_REFERER, que no está garantizado por el navegador. Es por eso que debe proporcionar una ''ubicación_de_detrás''.
En su acción de edición, almacene la url que solicita en el hash de sesión, que está disponible en varias solicitudes:
session[:return_to] ||= request.referer
A continuación, redirija a él en su acción de actualización, después de un guardado exitoso:
redirect_to session.delete(:return_to)
Me gusta el método de Jaime con una excepción, funcionó mejor para mí volver a almacenar el referer siempre:
def edit
session[:return_to] = request.referer
...
La razón es que si edita varios objetos, siempre se le redirigirá a la primera URL que almacenó en la sesión con el método de Jaime. Por ejemplo, digamos que tengo objetos Apple y Orange. Edito Apple y la session[:return_to]
se establece en el referer de esa acción. Cuando voy a editar naranjas usando el mismo código, la session[:return_to]
no se establecerá porque ya está definida. Así que cuando actualice el Orange, seré enviado al referer de la acción de edición Apple # anterior.
Para aquellos que estén interesados, aquí está mi implementación ampliando la respuesta original de MBO (escrita contra los raíles 4.2.4, ruby 2.1.5).
class ApplicationController < ActionController::Base
after_filter :set_return_to_location
REDIRECT_CONTROLLER_BLACKLIST = %w(
sessions
user_sessions
...
etc.
)
...
def set_return_to_location
return unless request.get?
return unless request.format.html?
return unless %w(show index edit).include?(params[:action])
return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
session[:return_to] = request.fullpath
end
def redirect_back_or_default(default_path = root_path)
redirect_to(
session[:return_to].present? && session[:return_to] != request.fullpath ?
session[:return_to] : default_path
)
end
end
request.referer
se establece por Rack y se configura de la siguiente manera:
def referer
@env[''HTTP_REFERER''] || ''/''
end
Simplemente haga un redirect_to request.referer
y siempre lo redireccionará a la página de referencia verdadera, o al root_path (''/''). Esto es esencial cuando pasa pruebas que fallan en casos de navegación directa a una página particular en la que el controlador arroja un redirect_to: back