如何使用 3 个或语句编写 Pundit 策略?

How to write a Pundit policy with 3 or statements?

我有一个 Pundit policy 可以正常工作,但我写它的方式似乎不是 "best" 的表达方式。这是一个包含三个 "or" 语句的策略。这是代码:

def update?
  user.admin? or user.moderator? || user.id == @artist.user_id
end

还有什么其他的写法?或者这是最好的表达方式?

两种可能的方式:

def update?
  user.admin_or_moderator? || user == @artist.user
end

admin_or_moderator? 只是说,它甚至可以是 privileged? 并在您的 User 模型中实现此方法。或者

def update?
  %i(admin moderator).include?(user.role) || user == @artist.user
end

我猜你在你的 User 模型中有类似的角色,但这就是想法

顺便说一句,你可以做如下事情:

delegate *%w(admin? moderator?), to: :user

def user_artist?
  user == @artist.user
end

def update?
  admin? || moderator? || user_artist?
end

我觉得这很干净。