🔖
【Rails/CanCanCan】特定の条件下でのみload_and_authorize_resourceしたい【if/unless】
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
オプションが活用できる
参考
Discussion