with redirect_to react rails method entre diferencia ruby-on-rails redirect

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