我有这段代码定义了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?
的假设。那是什么为?
答案 0 :(得分:0)
所以,according to the CanCan docs,当你将一个块传递给can
时(这就是这里发生的事情),只有当块返回true时才会给出权限。传入块的对象是用户可能有权执行某些操作的对象。
如果符合以下条件,则此操作授予用户在permission.action
课程上执行permission.thing_type
的权限:
thing
是零。这种情况可能发生在像create
权限这样的情况下,它不会占用特定的对象(而是取代了类)。 permission.thing_id
是零。这是处理Permission
对象并不指向特定事物的情况。这感觉就像第1项的另一面。它可能适用于'毯子' permissions - 一个权限,表示特定用户可以对此类的任何对象执行此操作。 OR thing
具有在权限对象中指定的ID。道德:评论您的代码。即使现在对你来说显而易见的是什么,也可能不是下一个人。几个月后谁也可能是你。