🔖
【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