TL;DR 不要用 rolify gem,先自製 User#role,有需要再用 pundit gem
## User#role 最簡單
在 User 欄位上新增一個 role 欄位,裡面存 admin, staff 等等是最簡單的方式
* 後台只有 admin 可以編輯
* 權限用 before_action :required_admin 即可
## Rolify gem 不推薦
延伸 role,接下來你會想說讓 role 可以多選,於是有個 Rolify gem 看起來不錯
我的經驗是這步錯了,不好用
因為假設真的是根據用戶角色定義,那在 view 裡面要檢查權限時,會變成
View 上面就會變成:
has_any_role?(X, Y, Z …etc) 就會很煩。如果需要修改權線,就會變成好幾個地方都要修改
還有 N+1 問題,要 preload 改寫成 has_cached_role?,很礙事。
如果要避免上述寫法,你可能會變成定義很多權限角色
但是這樣後台要選用戶角色時,就會變成..... 要選很多.... 就會很亂也搞不清楚誰是誰有沒有權限
## 進一步用 Pundit gem
我推薦的做法是用 User#role 加上 pundit 即可
這裡的一個秘訣是 Pundit 不一定總是綁在 model
你可以基本就只有一個 policy 叫過 admin policy 即可
或是 student, ta, teacher 的情境等等都可以
我稱作 可編程的 role 用法??
這樣 role 不用多,透過 pundit 寫程式判斷每個 role 有沒有權限即可
view 裡面要怎麼用,完全照你的彈性設計即可,可以用 model CRUD,也可以用角色,混雜沒關係的
anti-pattern
找一下之前 lighthouse v1 的 code
這種就是用的太複雜
> cancancan 跟 pundit 比較像,但是我不喜歡他的 API 不夠簡單。