redirect_to rails entre diferencia ruby-on-rails ruby http

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. Utilice redirect_back(fallback_location: fallback_location) ubicación_de_defensa: ubicación_de_defensa redirect_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 )