背景
Railsアプリで「投稿一覧 → 投稿詳細 → 戻る」という遷移を実装していましたが、
「いいねボタン」を追加すると戻るボタンが正しく機能しない問題に直面しました。
問題
戻るボタンに request.referer を使用していましたが
いいねボタンのクリックでリファラが上書きされ
投稿一覧ページに戻れなくなっていました。
request.refererとは
現在のリクエストがどのURLから来たかを示す情報を取得できる。
例) ユーザーがあるページから別のページに遷移する際、遷移元のページのURLを知りたいときに使える
show.html.erb
<%= link_to '戻る', request.referer || posts_path %>
posts_controller.rb
def show
@post = Post.find(params[:id])
end
like.html.erb
<%= link_to '♡', post_likes_path(post), method: :post %>
原因
request.referer は、最後のリクエストのURLを参照するため
いいねボタンを押すとリファラが[いいねアクションURL]に変わってしまうため
解決策
投稿一覧ページのURLをセッションに保持して
戻るボタンに使用することで解決できました。
修正後のコード
index.html.erb
<%= link_to '詳細ページ' post_path(post, previous_url: request.original_url) %>
show.html.erb
<%= link_to '戻る', session[:previous_url] || posts_path %>
posts_controller.rb
def show
@post = Post.find(params[:id])
session[:previous_url] = params[:previous_url] if params[:previous_url].present?
end
最後に
こちらにより、複数のアクション間を跨ぐケースでも安心してできます。
もっと簡単な方法などあるかもしれませんがコメントで教えていただけると幸いです
ありがとうございました!!