はじめに
たとえばECサイトの購入ページからユーザー情報を更新した後、トップページに飛ばされたらどうでしょう?
ユーザーはまた購入画面にアクセスし直さなければならず、かなりUXが悪い状態になってしまいます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F672627%2F7f9ba5a6-f57d-5386-85bc-ed69abae3da8.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=944498c1271c003376ad8421333aabf4)
直接指定すれば良いのでは?
もちろんページ同士が1対1の関係にある場合はこれでOKです。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F672627%2F76971680-854e-091f-0c0b-aaeb736c8c54.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=9e3a02bbc394ea82c70264aaebf383fc)
しかし、ユーザー情報の更新などは他のページからも行えるようにしたいですよね。
ページの関係が多対1の場合、リンク元によって戻るページを変える必要があります。
1つ前のページに戻す方法
1つ前に戻る方法はRailsに標準メソッドにあるので簡単です。
redirect_back(fallback_location: root_path)
しかし、今回はこれを使うことができません。
実は「2つ前」に戻さないといけない
データの保存・更新では元のページ
→new
→create
と遷移するので元のページに戻るには2つ前に戻らないといけません。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F672627%2F7ec223fc-5685-bd59-aa11-33fa0cc5139a.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=22bb4cc622707a7e28566158de8f645f)
そこで、戻りたいページのURLをセッションに保存し、create後にそのページに遷移する設定にします。
def new
session[:previous_url] = request.referer # ここで前ページセッションを保存
end
def create
redirect_to session[:previous_url] # create後に遷移させる
end
request.referer
で遷移元のURLを取得することができるので、それをセッションに保存し、createメソッド後に保存しておいたセッションを利用してnew直前のページに遷移させています。
これで2つ前のページに戻ることができます。
参考
Referer - HTTP | MDN
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referer
Action Controller の概要 - Railsガイド
https://railsguides.jp/action_controller_overview.html#request%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8response%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88