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

我无法让“块”版本的测试工作。其他一切正常..但块不起作用。我显然做错了什么,所以我试图理解。谢谢

https://gitlab.quints.io/quints/bi_backend/-/blob/pre_production/app/models/payment_system/bank_transfer_requisite.rb#L61

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 trueauthorized, 但是 不会加载任何用户。

更多解释,here.