在我的一个项目中,我开始使用pundit gem,我有一个非常简单的政策,如下所示:
class CompanyPolicy < ApplicationPolicy
def index?
true if user.is_a? Administrator
end
def new?
true if user.is_a? Administrator
end
def create?
new?
end
def edit?
true if user.is_a? Administrator
end
def update?
edit?
end
end
问题是如何避免重复此事:
true if user.is_a? Administrator
答案 0 :(得分:3)
我的伎俩看起来像这样:
class ApplicationPolicy
private
def self.permit_owner_to(*actions)
actions.each do |action|
define_method("#{action}?") do
owner?
end
end
end
def owner?
# owner logic
end
end
并在其他政策中使用
class ItemPolicy < ApplicationPolicy
permit_owner_to :show, :update, :destroy, :confirm
end
答案 1 :(得分:2)
我实际上并不认为你需要删除它。通过重复此操作,您明确表示此用户必须是管理员才能访问此方法。如果你确实想要,你可以创建一个私有方法。
class CompanyPolicy < ApplicationPolicy
def index?
admin?
end
def new?
admin?
end
def create?
new?
end
def edit?
admin?
end
def update?
edit?
end
private
def admin?
user.is_a? Administrator
end
end
猜猜这是个人偏好的问题。
答案 2 :(得分:1)
您可以使用alias_method
。
class CompanyPolicy < ApplicationPolicy
def index?
user.is_a? Administrator
end
alias_method :create?, :index?
alias_method :update?, :index?
end
您有一个可能已经包含的基类ApplicationPolicy
:
def new?
create?
end
def edit?
update?
end
所以你不需要在你的子类中重复这些方法。
.is_a?
返回true
或false
,因此无需明确返回true if true
。
那简洁得多了呃? :)