redirect_to :back
に問題があります。はい、リファラーです。
私はしばしば例外を受け取ります
(ActionController :: RedirectBackError) "このアクションへのリクエストにHTTP_REFERERが設定されていないため、redirect_to:backを正常に呼び出すことができませんでした。これがテストの場合、request.env [\" HTTP_REFERER\"]を指定してください。
これは、リファラーが利用できないためであることがわかりました。たとえば、最後にアクセスしたページで各アクセスにセッション変数を設定し、HTTP_REFERERが利用できない場合、このセッション変数を使用してリダイレクトする方法はありますか?
doにセッションがあり、do n'tにリファラーがないことはほとんどありません。
リファラーが設定されていない状況はそれほど珍しくなく、私は通常その期待を救います:
def some_method
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to root_path
end
これを頻繁に行う場合(これは悪い考えだと思います)、Maranが提案するような他の方法でラップすることができます。
ところで、これはユーザーフローを曖昧にするので悪い考えだと思います。ログインの場合のみ、これは賢明です。
[〜#〜] update [〜#〜]:いくつかの人々がこれを指摘したように もはや機能しません with Rails 5.代わりに、redirect_back
、このメソッドはフォールバックもサポートしています。コードは次のようになります。
def some_method
redirect_back fallback_location: root_path
end
これが私の小さな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を渡して他の場所に移動できます。
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 プラグインのおかげで)
コア機能
redirect_back
は、Rails 5+のコア機能です。これは、ActionController::Redirecting
に既に含まれているApplicationController::Base
モジュールで使用できます。
廃止の警告:
redirect_to :back
は廃止され、Rails 5.1から削除されます。redirect_back(fallback_location: fallback_location)
を使用してください。fallback_location
は、リクエストにHTTPリファラー情報がない場合に使用する場所を表します。
編集: ソース
遅れているかもしれませんが、オプションを保持するメソッドを共有したいと思います。
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)
@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')}
最近、リダイレクトする必要がある:back
または特定のページへ。多くの解決策を試した後、私は最終的にこれが簡単で問題を解決するようだとわかりました:
if request.env["HTTP_REFERER"].present?
redirect_to :back
else
redirect_to 'specific/page'
end
session
詳細を使用する場合は、コードのelse部分で実行してください。