LoginSignup
0
1

More than 3 years have passed since last update.

【初学者向け】リクエストの送り元によって、当該アクションのリダイレクト先を変更する方法【Ruby on Rails】

Posted at

ポートフォリオ製作中の初学者です。
インスタグラム風アプリを製作しており、投稿削除機能を実装するに当たって詰まった部分があったので忘備録を兼ねて投稿します。同じ様な状況にいる方の参考になれば幸いです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

それぞれ狙ったパスへリダイレクトすることが出来ます!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1