ポートフォリオ製作中の初学者です。
インスタグラム風アプリを製作しており、投稿削除機能を実装するに当たって詰まった部分があったので忘備録を兼ねて投稿します。同じ様な状況にいる方の参考になれば幸いですm(._.)m
投稿の削除ボタンを
全投稿一覧ページ(view/pics/index.html.erb)
投稿の詳細ページ(view/pics/show.html.erb)
特定ユーザーの全投稿一覧ページ(view/users/show.html.erb)
に配置しました。
全てのボタンはpics_controller.rbのdeleteアクションにリクエストを送信する様になっています。
pics_controller.rb
before_action :find_pic, only:[:show, :edit, :update, :destroy]
def destroy
@pic.destroy
redirect_to root_path
end
end
private
def find_pic
@pic = Pic.find_by(id: params[:id])
end
しかしこのままだと、どのページのボタンからのリクエストも投稿削除後、一様にルートパスへリダイレクトされてしまいます。
それぞれにふさわしいリダイレクト先を設定したいですよね!
そんな時、こいつが役に立ちます。
Rails.application.routes.recognize_path(request.referer)
このコードによって、以下の例の様にアクションのリクエスト元ページに関連するコントローラーとアクションをハッシュで習得出来ます。
irb> > Rails.application.routes.recognize_path('/')
=> {:controller=>"rails/welcome", :action=>"index"}
これを応用してdestroyアクションを以下の様に編集すると
def destroy
@pic.destroy
lastpath = Rails.application.routes.recognize_path(request.referer)
if lastpath[:controller] == "users"
redirect_to user_path(@pic.user_id)
else
redirect_to pics_path
end
end
それぞれ狙ったパスへリダイレクトすることが出来ます!