特定のコントローラーで特定のアクションの場合を除いて、ユーザをログイン画面にリダイレクトしたい
Amazonでもメルカリでもそうですが、ログインしなくてもトップページとかは見れますよね。
きほん
deviseの:authenticate_user!
メソッド
ログインしていないユーザをログイン画面へリダイレクトするメソッドです。
定石
よくある書き方は、application_controllerのbefore_actionにexceptオプションで例外をつけるやり方です。例えば、indexアクションを除いてログイン画面へのリダイレクトをする場合は以下のようにします。
class ApplicationController < ActionController::Base before_action :authenticate_user!, except: [:index] #省略
アクションの指定だけでは物足りない!
では、上の例で、items#index
とcomments#index
のように、indexアクションが複数会ったらどうでしょう?
items#index
はログイン不要だけど、comments#index
はログイン必須にしたい!みたいなことありますよね。
そんな時は、コントローラ名とアクション名をチェックするメソッドを定義してあげます。
class ApplicationController < ActionController::Base before_action :authenticate_user!, if: :use_auth? private def use_auth? unless controller_name == 'items' && action_name == 'index' true end #省略
コントローラやアクションの名前はそれぞれcontroller_name
とaction_name
で取得できるようです。こちらの記事が参考になりました。