web-dev-qa-db-ja.com

Ruby on Railsリファラーが利用できない場合に正しくリダイレ​​クト:back in === [(

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

私はしばしば例外を受け取ります

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

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

91
user67050

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

これが私の小さな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を渡して他の場所に移動できます。

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

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

37
Maran

コア機能

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

廃止の警告:redirect_to :backは廃止され、Rails 5.1から削除されます。redirect_back(fallback_location: fallback_location)を使用してください。fallback_locationは、リクエストにHTTPリファラー情報がない場合に使用する場所を表します。

編集: ソース

29

遅れているかもしれませんが、オプションを保持するメソッドを共有したいと思います。

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

@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')}
13
longkt90

最近、リダイレクトする必要がある:backまたは特定のページへ。多くの解決策を試した後、私は最終的にこれが簡単で問題を解決するようだとわかりました:


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

session詳細を使用する場合は、コードのelse部分で実行してください。

0
Rahul Goyal