参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/b3c70a1
\app\policies\application_policy.rb\app\policies のその他のファイル\app\policies\user_policy.rb にdef destroy? user&.is_admin? end
と書きます。
is_admin 部分は、WEBアプリの仕様に依存します。
@users = User.all なら、@users = policy_scope(User) のように書き換えます。authorize @user です。
ちなみに、
user&. の & は、Ruby の仕様で「ぼっち演算子」と言われます。
user.is_admin? としていて、user が nil だと NoMethodError になります。
& を付けておくと、
user&.is_admin? 全体で nil を返してくれます。
上記の例でいえば、
何らかの理由で user が定義されていない状態で認可チェックをした場合でも、
安全に nil → false 扱い → 認可拒否、になります。
\app\policies\application_policy.rb で、
元々デフォルト全部拒否になっていますが、
多少書き換えておきます。
実際の内容は、リポジトリを参照してください。
前章の Cancancan では、
認可拒否になるリンクをクリックした場合は、
root_path (トップページ) に遷移してメッセージを出していました。
コードは、rescue_from 一つで済むので簡単ですが、
ユーザーの操作性は良くないです。
今回は、
拒否になるリンクが押せないよう、
状況に合わせて link_to や button_to 部分を隠すようにします。
View の各所で地道にコードを書かないといけない点が面倒ですが、
ユーザーの操作性は良くなるでしょう。
実際の内容は、リポジトリを参照してください。