Ich habe ein Problem mit redirect_to :back
. Ja, es sind Verweise.
Ich bekomme oft die Ausnahme
(ActionController :: RedirectBackError) "Es wurde kein HTTP_REFERER in der Anforderung für diese Aktion festgelegt, daher konnte redirect_to: back nicht erfolgreich aufgerufen werden. Wenn dies ein Test ist, müssen Sie request.env [\" HTTP_REFERER\"angeben."
Mir ist klar, dass dies darauf zurückzuführen ist, dass ein Referrer nicht verfügbar ist. Gibt es eine Möglichkeit, mit der zuletzt besuchten Seite eine Sitzungsvariable für jeden Zugriff festzulegen und diese Sitzungsvariable zu verwenden, wenn HTTP_REFERER nicht verfügbar ist?
Es ist unwahrscheinlich, dass Sie do eine Sitzung haben und nicht einen Referrer haben.
Die Situation, dass ein Referrer nicht gesetzt ist, ist nicht ungewöhnlich und ich rette diese Erwartung normalerweise:
def some_method
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to root_path
end
Wenn Sie dies häufig tun (was ich für eine schlechte Idee halte), können Sie es in eine andere Methode einwickeln, wie Maran vorschlägt.
Übrigens finde ich das eine schlechte Idee, da dies den Benutzerfluss mehrdeutig macht. Nur bei einem Login ist dies sinnvoll.
UPDATE: Wie mehrere Leute darauf hingewiesen haben, dass funktioniert nicht mehr mit Rails 5 . Verwenden Sie stattdessen redirect_back
, diese Methode unterstützt auch einen Fallback. Der Code wird dann zu:
def some_method
redirect_back fallback_location: root_path
end
Hier ist meine kleine redirect_to_back-Methode:
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
Sie können eine optionale URL angeben, um an eine andere Stelle zu gelangen, wenn http_refferrer leer ist.
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
Versuch das! (Danke an das Authlogic Plugin)
Kernfunktion
redirect_back
ist eine Kernfunktion von Rails 5+. Es ist im ActionController::Redirecting
-Modul verfügbar, das bereits inApplicationController::Base
enthalten ist.
DEPRECATION WARNUNG:
redirect_to :back
ist veraltet und wird von Rails 5.1 entfernt. Verwenden Sieredirect_back(fallback_location: fallback_location)
, wobeifallback_location
den Speicherort darstellt, der verwendet werden soll, wenn die Anforderung keine HTTP-Verweisinformationen enthält.
BEARBEITEN: source
Vielleicht ist es spät, aber ich möchte meine Methode mitteilen, die auch Optionen enthält:
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
Sie können es wie folgt verwenden:
redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)
Ähnlich der Antwort von @ troex, fügen Sie dies zu Ihrem Anwendungscontroller hinzu
def redirect_back_or_default(default = root_path, options = {})
redirect_to (request.referer.present? ? :back : default), options
end
dann verwenden Sie es in Ihrem Controller
redirect_back_or_default answer_path(answer), flash: { error: I18n.t('m.errors')}
Vor kurzem bin ich auf dasselbe Problem gestoßen, bei dem ich entweder :back
oder auf eine bestimmte Seite umleiten musste. Nachdem ich zu viel Lösung gegangen bin, habe ich endlich das gefunden, was einfach ist und das Problem zu lösen scheint:
if request.env["HTTP_REFERER"].present?
redirect_to :back
else
redirect_to 'specific/page'
end
Wenn Sie session
-Details verwenden möchten, tun Sie dies im else-Teil des Codes.