ruby-on-rails 鸭子类型的康康舞场景

4jb9z9bj  于 2023-05-30  发布在  Ruby
关注(0)|答案(1)|浏览(113)

这是我的能力.initialize:

user ||= User.new # handle guest user

if user.has_role? :admin
    can :manage, :all
elsif user.has_role? :moderator
    can :read, :all
    can :update, :all do |clazz|
        clazz.managed_by? user
    end
elsif user.has_role? :participant
    can :update, :all do |clazz|
        clazz.owned_by? user
    end
    can :read, :all do |clazz|
        clazz.visible_to? user
    end
else
    raise "Role decoding in Ability fell through"
end

我的意图是关键域类[User、Round、Participant、Question和Program]都定义了一个owned_by?,managed_by?一个visible_to?并且统一应用允许更新或查看其中之一的规则。
但我相信像这样的陈述:

can :update, :all do |clazz|
        clazz.owned_by? user
    end

你没有做我想做的事情,因为我甚至不认为我能到达clazz.owned_by?线。
接下来我可以尝试什么?我看了看医生,无法真正将它所说的与我使用的技术联系起来。

yhuiod9q

yhuiod9q1#

我相信:all只是一个符号,而不是遍历所有类的迭代器。你可以像我在这里做的那样显式地列出它们,或者使用这个解决方案来获得所有模型的列表:https://stackoverflow.com/a/516605/2033014

[User, Round, Participant, Question, Program].each do |klass|
  can :update, klass, klass.owned_by?(user)
  can :read, klass, klass.visible_to?(user)
end

相关问题