Tengo una página que enumera todos los proyectos que tienen encabezados y paginación ordenables.
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, llama al controlador de proyectos / método de actualización. Después de actualizar el código, 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 podría funcionar en redirect_to (: back), pero eso no es posible.
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.
fuente
redirect_to session.delete(:return_to)
en la acción de actualización. Esto limpia el valor de la sesión, ya que ya no es necesario.redirect_to request.referer
?request.referer.referer
, si eso fuera posible. @Jaime Bellmyer ¿Por qué||=
?¿Por qué
redirect_to(:back)
no funciona para ti, por qué es un no ir?redirect_to(:back)
Funciona como un encanto para mí. Es solo un atajo pararedirect_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 usarredirect_back(fallback_location: 'something')
en su lugar (consulte http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )fuente
redirect_to :back
tampoco funciona bien para mí, digamos que visita/posts/new
, esto se establece como el referente para la próxima solicitud, por lo que después de que el formulario se envíe con éxito, muestra el formulario nuevamente, es decir/posts/new
. Sin embargo, funciona bien para otros fines.redirect_to projects_path
.HTTP_REFERER
no está configurado, es posibleActionController::RedirectBackError
que tenga que rescatarlo de esta excepción en ese caso. Según tengo entendido, el usoredirect_back
no requiere ningún manejo de excepciones, ya que está obligado a proporcionarfallback_location
. Tal vez "no funciona bien" no es la forma correcta de decirlo.Me gusta el método de Jaime con una excepción, funcionó mejor para mí volver a almacenar el árbitro cada vez:
La razón es que si edita varios objetos, siempre será redirigido 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 me pongo
session[:return_to]
al árbitro de esa acción. Cuando vaya a editar Naranjas con el mismo código,session[:return_to]
no se configurará porque ya está definido. Entonces, cuando actualice el Orange, me enviarán al árbitro de la acción de edición Apple # anterior.fuente
Así es como lo hacemos en nuestra aplicación
De esta manera, solo almacena la última solicitud GET en el
:return_to
parámetro de sesión, por lo que todos los formularios, incluso cuando la POSTed en varias ocasiones funcionaría:return_to
.fuente
request.request_uri
ya no está disponible, así que sugiero usarrequest.fullpath
en su lugarand
yor
en lasif
declaraciones. Uso&&
y en su||
lugar. Detalles aquí .En los rieles 5, según las instrucciones de las Guías de rieles, puede usar:
La ubicación 'atrás' se extrae del encabezado HTTP_REFERER que no se garantiza que el navegador establezca. Es por eso que debe proporcionar una 'ubicación de retorno'.
fuente
notice
objeto con laredirect_back
declaración para decirle al usuario que algo salió mal con un mensaje flash?redirect_back(fallback_location: root_path, notice: "Something went wrong!")
. Espero que pueda ayudar de alguna manera.request.referer
Rack lo establece y se establece de la siguiente manera:Simplemente haga un
redirect_to request.referer
y siempre redirigirá a la página de referencia verdadera, o al root_path ('/'). Esto es esencial cuando se pasan pruebas que fallan en casos de navegación directa a una página en particular en la cual el controlador lanza un redirect_to: backfuente
referer
se definió a partir del 28 de marzo de 2011 , y así es como se define a partir de hoy . Es decir,|| '/'
no es parte de la definición.Para aquellos que estén interesados, aquí está mi implementación que amplía la respuesta original de MBO (escrita contra rails 4.2.4, ruby 2.1.5).
fuente