Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 坎坎与能力块_Ruby On Rails_Ruby On Rails 3_Cancan - Fatal编程技术网

Ruby on rails 坎坎与能力块

Ruby on rails 坎坎与能力块,ruby-on-rails,ruby-on-rails-3,cancan,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.

我有一段代码定义了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
我知道block用于定义复杂的条件,我猜
permission.thing\u id==thing.id
的存在是为了只为选定的对象授予权限,但我看不到
thing.nil?|的目的permission.thing\u id.nil?
。这是干什么用的?

因此,当您将一个块传递给
can
(这就是这里发生的事情)时,只有当该块返回true时,才授予权限。传递到块中的对象是用户可能有权对其执行操作的对象

这样做的目的是授予用户对类执行
permission.action
的权限。如果:

  • 东西
    为零。这可能发生在
    create
    permission这样的情况下,它不接受特定的对象(而是接受类)
  • 权限。thing\u id
    为零。这是处理
    权限
    对象不指向特定对象的情况。这感觉像是第1项的另一面。它可能适用于“一揽子”权限的情况,该权限表示特定用户可以对此类的任何对象执行此操作。或
  • 对象
    具有权限对象中指定的id
  • 寓意:评论你的代码。即使你现在很清楚某件事的作用,但下一个人可能不知道。几个月后,谁也可能是你