2

我有四个场景想要获得一些反馈,以便更好地了解 CanCan 如何与技能配合使用。

1 - 使用迭代中的对象可以将模型传递给 CanCan。它似乎工作正常。似乎这将从传递的对象中定义一个非常具体的能力。

 @users.each do |user|
    link_to user.name, user_path(user) if can? :edit, user

2 - @user 不是在控制器中设置的变量。我假设这与 #1 相同,因为 load_and_authorize_resource 创建了 @user 实例。

 @users.each do |user|
    link_to user.name, user_path(user) if can? :edit, @user

但是,当一个实例变量存在于与当前模型无关的视图中并且不是故意在控制器中设置的时候呢?例如,当 @account 实例未在 show 操作中设置时,显示用户页面内的以下内容。当 CanCan 甚至不知道它是什么时,它如何使用 @account?

  link_to "view user account", account_path(1) if can? :read, @account

3 - 使用模型定义能力怎么样?我认为这是一个非常广泛的“可以编辑用户”的能力......你什么时候会使用它?

 @users.each do |user|
    link_to user.name, user_path(user) if can? :edit, User

4 - 使用关联。不会破坏页面...但是,我不确定它是否按预期工作。

 @users.each do |user|
    link_to "view user account", account_path(1) if can? :read, user.account
4

1 回答 1

1

哦,一个多部分的问题。

案例#1 和#2

这两个几乎相同。不同之处在于,@user变量是在您的控制器中预先设置的,load_and_authorize_call或者在您的操作之前运行的其他过滤器。

如果您想检查单个对象的权限,这很有用,即用户只能编辑他们自己的记录。

对于案例 #2 的结尾:

您需要确保在控制器中设置变量,然后才能在控制器或视图中访问它们以进行权限检查。就像您想在其他与权限检查无关的情况下访问它们一样。

案例#3

主要用于用户可以编辑特定类的所有对象的情况。

如果您希望用户编辑特定类的所有对象,这很有用,即管理员可以编辑所有用户的详细信息

案例#4

使用关联将抓取该记录并将其传递给 CanCan,就像使用 will 一样if can? :read, user。与案例 #1 并没有什么不同。

于 2012-10-18T01:10:10.723 回答