🔖

【Rails/CanCanCan】特定の条件下でのみload_and_authorize_resourceしたい【if/unless】

2025/01/16に公開

load_and_authorize_resourceは内部的にbefore_actionを利用してコントローラのアクションが呼ばれる前に権限チェックを行えますが、変数定義の問題などで条件分岐を書けない場合があります。

このようなとき、以下のようにload_and_authorize_resourceを使わず、各アクションの中でauthorize!を書いて権限チェックを行う方法があります。

class BooksController < ApplicationController
  def edit
    if some_condition?
      authorize! :update, @book
    end
  end
end

しかし、各アクションでauthorize!を書いたりコールバックでload_and_authorize_resourceを使ったり......というのは、記法の不統一や記述量の増加の面から避けたい使い方です。

そこで便利なのが、if/unlessオプションを使う方法です。

load_and_authorize_resourceなどのCanCanCanのメソッドでは、コントローラ内でメソッドを定義し、以下のようにif/unlessオプションを使ってあげることで、Railsのコールバックメソッドと同様に条件分岐を加えられます。

class BooksController < ApplicationController
  load_and_authorize_resource, if: :some_condition?

  def edit
  end

  private

  def some_condition?
  end
end

まとめ

  • 「ある条件のときだけ load_and_authorize_resource を利用したい」場合は、Railsのコールバックメソッドと同じようにif/unlessオプションが活用できる

参考

https://www.rubydoc.info/github/CanCanCommunity/cancancan/CanCan/ControllerAdditions/ClassMethods

Discussion