Ruby on Railsでreferrerが利用できない場合にredirect_to:backを正しく行う


91

に問題がありredirect_to :backます。はい、それはリファラーです。

私はよく例外を受けます

(ActionController :: RedirectBackError)「このアクションへのリクエストにHTTP_REFERERが設定されていないため、redirect_to:backを正常に呼び出すことができませんでした。これがテストの場合は、request.env [\ "HTTP_REFERER \"]を指定してください。」

これはリファラーが利用できないことが原因であると思います。たとえば、最後にアクセスしたページで各アクセスにセッション変数を設定し、HTTP_REFERERが使用できない場合にこのセッション変数を使用してリダイレクトする方法はありますか?


更新アクションにも同じエラーがありますが、リファラーを空にできなかった(フォームからのリクエストのように)ため、これは奇妙ですが、何人かのユーザーがこれを実行して、方法がわかりません。
lulalala 2012

回答:


144

あなたがいることはほとんどありませんセッションを持っていないリファラを持っています。

リファラーが設定されていない状況はそれほど珍しくなく、私は通常その期待を救います:

def some_method
  redirect_to :back
rescue ActionController::RedirectBackError
  redirect_to root_path
end

これを頻繁に行う場合(これは悪い考えだと思います)、Maranが提案するような他の方法でラップすることができます。

ところで、これはユーザーフローがあいまいになるので、悪い考えだと思います。ログインの場合のみ、これは賢明です。

更新:これはRails 5では機能ないと指摘した人redirect_backもいますが、代わりにを使用して、このメソッドはフォールバックもサポートしています。コードは次のようになります。

def some_method
  redirect_back fallback_location: root_path
end

4
これを変更して、代わりにrescue_fromを使用すると思います。
ボブ・アマン

1
rescue_fromコントローラが複数ある場合に使用できる@BobAman IMOredirect_to :back
Theo B

Rails 5では動作しません。ActionController:: RedirectBackErrorは未定義です...どのようなソリューションですか?
マトリックス

代わりにこれを使用してください:redirect_to (request.referrer || root_url)
Abhi

38

これが私の小さな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

http_refferrerが空白の場合、オプションのURLを渡して別の場所に移動できます。


37
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

やってみて!(Authlogicプラグインのおかげで)


22
これは良い解決策ですが、ユーザーが複数のタブを使用してアプリを閲覧している場合、ユーザーを非常に混乱させるような方法で「壊れる」可能性があることを覚えておいてください。
ミッチリンドグレン

3
+1質問に答え、設計方法を批判しないため。
安倍ペトリロ2011

31

コア機能

redirect_backはRails 5以降のコア機能であり、ActionController::Redirectingすでにに含まれているモジュールで使用できますApplicationController::Base

redirect_to :back非推奨の警告:は非推奨であり、Rails 5.1から削除されます。使用してくださいredirect_back(fallback_location: fallback_location)どこfallback_locationの要求にはHTTPリファラ情報を持っていない場合に使用する場所を表します。

編集:ソース


ソースへのリンク、してください
クリス・ブルーム

1
@ Chrisbloom7これは、Rails 5.0.0beta3をで実行中に表示された警告メッセージredirect_to :backです。
Cyril Duchon-Doris

21

多分それは遅いですが、オプションも保持する私の方法を共有したいと思います:

  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

次のように使用できます。

redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)

14

@troexの答えと同様に、これをアプリケーションコントローラーに追加します

def redirect_back_or_default(default = root_path, options = {})
  redirect_to (request.referer.present? ? :back : default), options
end

それをコントローラーで使用します

redirect_back_or_default answer_path(answer), flash: { error: I18n.t('m.errors')}

0

最近、リダイレクト:backまたは特定のページに移動する必要があるという同じ問題が発生しました。多くの解決策に行った後、私はようやくこれが簡単で問題を解決するように見えるこれを見つけました:


if request.env["HTTP_REFERER"].present?
    redirect_to :back
else
    redirect_to 'specific/page'
end

session詳細を使用する場合は、コードのelse部分で行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.