web-dev-qa-db-ja.com

Ruby On Railsの前のページにリダイレクトする方法は?

並べ替え可能なヘッダーとページネーションを持つすべてのプロジェクトをリストするページがあります。

path:
/projects?order=asc&page=3&sort=code

プロジェクトの1つを編集することにしました

path:
projects/436/edit

そのページで[保存]をクリックすると、プロジェクトコントローラー/更新メソッドが呼び出されます。コードを更新した後、特定のプロジェクトの編集をクリックする前にいたパスにリダイレクトしたい。言い換えれば、私は同じページに同じソートで行きたいです。

Link_to(:back)を見て、reback_to(:back)で:backが機能するかもしれないと思ったが、それは無理だ。

puts YAML::dump(:back) 
yields the following:
:back 

どのようにこれを機能させることができるかについてのアイデア。簡単に解決できる問題のように思えますが、私はRoRが初めてです。

178
easement

編集アクションで、リクエストURLをセッションハッシュに保存します。これは、複数のリクエストで利用できます。

session[:return_to] ||= request.referer

次に、保存に成功した後、更新アクションでリダイレクトします。

redirect_to session.delete(:return_to)
316
Jaime Bellmyer

redirect_to(:back)がうまくいかないのはなぜですか?

redirect_to(:back)は私にとって魅力的です。 redirect_to(request.env['HTTP_REFERER'])の単なるショートカットです

http://apidock.com/Rails/ActionController/Base/redirect_to (pre Rails 3)または http://apidock.com/Rails/ActionController/ Redirecting/redirect_to (レール3)

redirect_to(:back)はRails 5.で非推奨になっていることに注意してください。

代わりにredirect_back(fallback_location: 'something')http://blog.bigbinary.com/2016/02/29/Rails-5-improves-redirect_to_back-with-redirect-back.html を参照)

96
pascal betz

私は1つの例外を除いてJaimeのメソッドが好きです、毎回リファラーを再保存する方がうまくいきました:

def edit
    session[:return_to] = request.referer
...

その理由は、複数のオブジェクトを編集すると、常にJaimeのメソッドを使用してセッションに保存した最初のURLにリダイレクトされるためです。たとえば、オブジェクトAppleとOrangeがあるとします。 Appleを編集すると、session[:return_to]がそのアクションのリファラーに設定されます。同じコードを使用してオレンジを編集する場合、session[:return_to]は既に定義されているため設定されません。したがって、オレンジを更新すると、以前のApple#editアクションのリファラーに送信されます。

45
Tony

これがアプリケーションでの方法です

def store_location
  session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
end

def redirect_back_or_default(default)
  redirect_to(session[:return_to] || default)
end

この方法では、:return_toセッションパラメータに最後のGETリクエストのみを保存するため、複数回POSTが:return_toで機能する場合でも、すべてのフォームが保存されます。

33
MBO

request.refererはRackによって設定され、次のように設定されます。

def referer
  @env['HTTP_REFERER'] || '/'
end

redirect_to request.refererを実行するだけで、常に真の参照ページまたはroot_path( '/')にリダイレクトされます。これは、direct-navの場合に失敗するテストを、コントローラーがredirect_to:backをスローする特定のページに渡すときに不可欠です。

18
Steve Tipton

Rails 5では、Railsガイドの手順に従って、次を使用できます。

redirect_back(fallback_location: root_path)

「戻る」場所は、ブラウザによって設定されることが保証されていないHTTP_REFERERヘッダーから取得されます。そのため、「fallback_location」を指定する必要があります。

13
pSkarl

興味がある人のために、MBOの元の答えを拡張した私の実装を以下に示します(Rails 4.2.4、Ruby 2.1.5に対して書かれています)。

class ApplicationController < ActionController::Base
  after_filter :set_return_to_location

  REDIRECT_CONTROLLER_BLACKLIST = %w(
    sessions
    user_sessions
    ...
    etc.
  )

  ...

  def set_return_to_location
    return unless request.get?
    return unless request.format.html?
    return unless %w(show index edit).include?(params[:action])
    return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
    session[:return_to] = request.fullpath
  end

  def redirect_back_or_default(default_path = root_path)
    redirect_to(
      session[:return_to].present? && session[:return_to] != request.fullpath ?
        session[:return_to] : default_path
    )
  end
end
1
aschyiel