CanCanCan "index" 规则有和没有块的区别
Difference between CanCanCan "index" rule with and without a block
这两种说法基本一样吗?如果不是,那么第二个版本应该是什么样的?幕后发生了什么?
can :index, User, approved: true
can :index, User do |user|
user.approved?
end
我无法让“块”版本的测试工作。其他一切正常..但块不起作用。我显然做错了什么,所以我试图理解。谢谢
Note that if you pass a block to a can or cannot, the block only executes if an instance of a class is passed to can? or cannot? calls.
If you define a can or cannot with a block and an object is not passed, the check will pass.
也许这就是答案?
将实例传递给规则时使用带块的规则:
can?(:show, User.first)
index
操作很特殊,因为没有要传递给规则的用户实例,您加载的不是特定用户,而是多个。
所以,
can :index, User, approved: true
当 UserController#index
操作被点击时,假设您有 load_and_authorize_resource
(或类似的地方),它将加载 @users
所有具有 approved: true
的用户。如果没有条件,将加载所有用户。很简单。
现在,
can :index, User do |user|
user.approved?
end
如果规则有一个块并且实例没有传递给它(正如我上面所说的),规则将始终 return true
如 authorized, 但是 不会加载任何用户。
更多解释,here.
这两种说法基本一样吗?如果不是,那么第二个版本应该是什么样的?幕后发生了什么?
can :index, User, approved: true
can :index, User do |user|
user.approved?
end
我无法让“块”版本的测试工作。其他一切正常..但块不起作用。我显然做错了什么,所以我试图理解。谢谢
Note that if you pass a block to a can or cannot, the block only executes if an instance of a class is passed to can? or cannot? calls.
If you define a can or cannot with a block and an object is not passed, the check will pass.
也许这就是答案?
将实例传递给规则时使用带块的规则:
can?(:show, User.first)
index
操作很特殊,因为没有要传递给规则的用户实例,您加载的不是特定用户,而是多个。
所以,
can :index, User, approved: true
当 UserController#index
操作被点击时,假设您有 load_and_authorize_resource
(或类似的地方),它将加载 @users
所有具有 approved: true
的用户。如果没有条件,将加载所有用户。很简单。
现在,
can :index, User do |user|
user.approved?
end
如果规则有一个块并且实例没有传递给它(正如我上面所说的),规则将始终 return true
如 authorized, 但是 不会加载任何用户。
更多解释,here.