【问题标题】:How to write a Pundit policy with 3 or statements?如何用 3 个或语句编写 Pundit 政策?
【发布时间】:2018-05-15 15:38:38
【问题描述】:

我有一个工作正常的Pundit policy,但我编写它的方式似乎并不是表达这一点的“最佳”方式。这是一个包含三个“或”语句的策略。代码如下:

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

还有什么方法可以写这个?或者这是最好的表达方式?

【问题讨论】:

  • 出于好奇,你为什么把or||混在一起?关于a || b || c,什么似乎“不是最好的”?
  • 我只是为了在视觉上分开它,因为管理员和版主是相似的
  • FWIW,ruby style guide 建议 or 被“禁止”,因为“很可能会引入细微的错误”。
  • 酷。谢谢@jvillian

标签: ruby-on-rails ruby conditional control-flow pundit


【解决方案1】:

顺便说一句,您可以执行以下操作:

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

def user_artist?
  user == @artist.user
end

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

这对我来说似乎很干净。

【讨论】:

    【解决方案2】:

    两种可能的方式:要么

    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 模型中有类似的角色,但这就是想法

    【讨论】:

    • admin_or_moderator 放在用户模型中还是作为策略中的私有方法会更好吗?
    • 对我来说即使在用户模型中也有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多