web-dev-qa-db-ger.com

Redirect_to: zurück in Ruby on Rails, wenn der Referrer nicht verfügbar ist

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?

89
user67050

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
138
harm

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.

38
Mirko
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)

37
Maran

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 Sie redirect_back(fallback_location: fallback_location), wobei fallback_location den Speicherort darstellt, der verwendet werden soll, wenn die Anforderung keine HTTP-Verweisinformationen enthält.

BEARBEITEN: source

25

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)
21
troex

Ä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')}
12
longkt90

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.

0
Rahul Goyal