CanCan和能力阻止

时间:2013-09-24 22:03:46

标签: ruby-on-rails ruby-on-rails-3 cancan

我有这段代码定义了CanCan的用户权限,但我不明白该块内的条件是什么?

    class Ability
          include CanCan::Ability

          def initialize(user)

            user.permissions.each do |permission|
              can permission.action.to_sym,
              permission.thing_type.constantize do |thing|
               thing.nil? || permission.thing_id.nil? || permission.thing_id == thing.id
              end
            end


end
end

所以,这行代码让我烦恼:

permission.thing_type.constantize do |thing|
       thing.nil? || permission.thing_id.nil? || permission.thing_id == thing.id
end

我知道该块用于定义复杂的条件,我猜permission.thing_id == thing.id就在那里,所以只授予所选对象的权限,但我没有看到thing.nil? || permission.thing_id.nil?的假设。那是什么为?

1 个答案:

答案 0 :(得分:0)

所以,according to the CanCan docs,当你将一个块传递给can时(这就是这里发生的事情),只有当块返回true时才会给出权限。传入块的对象是用户可能有权执行某些操作的对象。

如果符合以下条件,则此操作授予用户在permission.action课程上执行permission.thing_type的权限:

  1. thing是零。这种情况可能发生在像create权限这样的情况下,它不会占用特定的对象(而是取代了类)。
  2. permission.thing_id是零。这是处理Permission对象并不指向特定事物的情况。这感觉就像第1项的另一面。它可能适用于'毯子' permissions - 一个权限,表示特定用户可以对此类的任何对象执行此操作。 OR
  3. thing具有在权限对象中指定的ID。
  4. 道德:评论您的代码。即使现在对你来说显而易见的是什么,也可能不是下一个人。几个月后谁也可能是你。