並べ替え可能なヘッダーとページネーションを持つすべてのプロジェクトをリストするページがあります。
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が初めてです。
編集アクションで、リクエストURLをセッションハッシュに保存します。これは、複数のリクエストで利用できます。
session[:return_to] ||= request.referer
次に、保存に成功した後、更新アクションでリダイレクトします。
redirect_to session.delete(:return_to)
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 を参照)
私は1つの例外を除いてJaimeのメソッドが好きです、毎回リファラーを再保存する方がうまくいきました:
def edit
session[:return_to] = request.referer
...
その理由は、複数のオブジェクトを編集すると、常にJaimeのメソッドを使用してセッションに保存した最初のURLにリダイレクトされるためです。たとえば、オブジェクトAppleとOrangeがあるとします。 Appleを編集すると、session[:return_to]
がそのアクションのリファラーに設定されます。同じコードを使用してオレンジを編集する場合、session[:return_to]
は既に定義されているため設定されません。したがって、オレンジを更新すると、以前のApple#editアクションのリファラーに送信されます。
これがアプリケーションでの方法です
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
で機能する場合でも、すべてのフォームが保存されます。
request.referer
はRackによって設定され、次のように設定されます。
def referer
@env['HTTP_REFERER'] || '/'
end
redirect_to request.referer
を実行するだけで、常に真の参照ページまたはroot_path( '/')にリダイレクトされます。これは、direct-navの場合に失敗するテストを、コントローラーがredirect_to:backをスローする特定のページに渡すときに不可欠です。
Rails 5では、Railsガイドの手順に従って、次を使用できます。
redirect_back(fallback_location: root_path)
「戻る」場所は、ブラウザによって設定されることが保証されていないHTTP_REFERERヘッダーから取得されます。そのため、「fallback_location」を指定する必要があります。
興味がある人のために、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