0

我有这段代码定义了 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?那是什么目的?

4

1 回答 1

0

因此,根据 CanCan 文档,当您将块传递给can(这就是这里发生的事情)时,只有当块返回 true 时才会授予权限。传递给块的对象是用户可能有权做某事的对象。

那么,在以下情况下,它的作用是授予用户permission.action在类上执行的权限permission.thing_type

  1. thing是零。这可能发生在诸如create权限之类的情况下,它不采用特定对象(而是采用类)。
  2. permission.thing_id是零。这是处理Permission对象不指向特定事物的情况。这感觉就像第 1 项的另一面。它可能适用于“一揽子”权限的情况 - 表示特定用户可以对此类的任何对象执行此操作的权限。或者
  3. 具有在权限对象中指定的thingid。

道德:评论你的代码。即使你现在很清楚某件事的作用,但对下一个人来说可能不是。几个月后,谁也可能是你。

于 2013-09-25T16:37:34.247 回答