ずみーBlog

元クラゲ研究者(見習い)の92年生まれがエンジニアを目指しながら日々寄り道するブログです。

特定のコントローラーで特定のアクションの場合を除いて、ユーザをログイン画面にリダイレクトしたい

Amazonでもメルカリでもそうですが、ログインしなくてもトップページとかは見れますよね。

きほん

deviseの:authenticate_user!メソッド

ログインしていないユーザをログイン画面へリダイレクトするメソッドです。

定石

よくある書き方は、application_controllerのbefore_actionにexceptオプションで例外をつけるやり方です。例えば、indexアクションを除いてログイン画面へのリダイレクトをする場合は以下のようにします。

class ApplicationController < ActionController::Base
  before_action :authenticate_user!, except: [:index]
  #省略

アクションの指定だけでは物足りない!

では、上の例で、items#indexcomments#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_nameaction_nameで取得できるようです。こちらの記事が参考になりました。