使用CanCan功能的不同方式

时间:2012-10-18 00:58:09

标签: ruby-on-rails-3 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

但是,如果视图中存在与当前模型无关且未在控制器中故意设置的实例变量,那该怎么办呢?例如,在show动作中未设置@account实例时,show user页面内的以下内容。 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

1 个答案:

答案 0 :(得分:1)

哦,这是一个多部分的问题。

案例#1和#2

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

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

对于案例#2的结尾:

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

案例#3

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

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

案例#4

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