使用Cancan能力的不同方式



我有四种我想获得一些反馈的情况,这样我就可以更好地了解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实例未在显示操作中设置@Account实例时,在显示用户页面中的以下内容。当Cancan不知道它是什么时,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

oooh,一个多部分问题。

案例#1和#2

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

如果要检查单个对象的权限,即用户只能编辑自己的记录。

对于情况#2的结尾:

您需要确保在控制器中访问控制器或查看以进行权限检查之前,请确保将变量设置在控制器中。就像您想在其他情况下访问与权限检查无关的情况。

案例#3

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

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

案例#4

使用关联将抓住该记录并将其传递给CANCAN,就像使用if can? :read, user一样。与情况#1没有什么不同。

最新更新