0

这是我的能力。初始化:

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] 都定义了 own_by?、managed_by? 和一个可见的?方法。并且统一应用允许更新或查看其中之一的规则。

但我相信这样的陈述:

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

没有按照我的想法做,因为我认为我什至没有到达 clazz.owned_by?线。

有人可以纠正我吗?我查看了文档,无法真正将它所说的内容与我正在使用的技术联系起来。谢谢你!

4

1 回答 1

2

我相信 :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
于 2013-02-02T19:34:46.987 回答