2013-02-02 45 views
0

这里是我的Ability.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 

我的本意是,关键领域类[用户,圆形,参与者,问题和程序]所有定义owned_by? MANAGED_BY?和一个visible_to?方法。而且允许其中一个更新或查看的规则统一适用。

但我相信,之类的语句:

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

没有做什么,我想是因为我不认为我什至在clazz.owned_by?线。

有人能理顺我吗?我查看了文档,并且无法真正将它所说的内容与我正在使用的技术连接起来。谢谢!

回答

2

我相信:所有只是一个符号而不是所有类的迭代器。您可以将它们全部列出,就像我在这里做的一样,或者使用此解决方案获取所有型号的列表: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 
+0

谢谢!问题,可以做的第三个参数是什么? (即klass.visible_to?) – pitosalas

+0

将一个块传递给作用域。在这里找到它:https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks看看示波器的屏蔽条件 – mathieugagne

+0

很难理解为什么需要第三个(klass.owned_by?),因为在块(第四个参数)再次被问到同样的问题:record.owned_by?用户。你可以解释吗? (我看了链接,但还不十分清楚。) – pitosalas