Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件第 12 天,跟我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!
開門見山的說,Pundit 是一款權限管理的實用套件。什麼是權限管理呢?
以會員為例,你可以在會員間設計不同的權限,哪些功能是A可以用,而B不能用,符合A或B的設定是什麼?
要注意的是,會員系統跟會員權限是不一樣的東西。我自己一開始在學習的時候,在這一塊有一點搞混。
一樣的,先 bundle add 安裝
bundle add pundit
接著在 ApplicationController
裡寫入 include Pundit::Authorization
class ApplicationController < ActionController::Base
include Pundit::Authorization
end
完成後,在終端中輸入:
rails g pundit:install
會在你的專案內app底下產生一個 policies
的資料夾,並且在內部會有一個application_policy.rb
的文件。內容如下:
# frozen_string_literal: true
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
false
end
def show?
false
end
def create?
false
end
def new?
create?
end
def update?
false
end
def edit?
update?
end
def destroy?
false
end
class Scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
raise NotImplementedError, "You must define #resolve in #{self.class}"
end
private
attr_reader :user, :scope
end
end
這個 application_policy.rb
一開始看起來,有點複雜,需要一點解釋來理解。
使用官方文件的例子來舉例好了!
class PostPolicy
attr_reader :user, :post
def initialize(user, post)
@user = user
@post = post
end
def update?
user.admin? || !post.published?
end
end
首先,class
是 PostPolicy,所以可以假設這是一個與 Post Model
具有相同的名稱的 Policy。
第一個參數是使用者。在 Controller 中,Pundit 會呼叫 current_user 的方法來抓取要傳送到此參數的內容。
第二個參數可以是某種 Model 對象,要檢查其授權。不需要是 ActiveRecord 或 ActiveModel,它可以是任何東西。
到這裡應該還可以理解,不過真正麻煩的其實從這裡才開始!這個套件有很多小小細節要注意。
我認為有必要將這個套件分為 上/下集 來寫,今天先介紹到這裡,我們改日再補完下集!
我們明天見!