正确定义CanCan中的能力

时间:2013-04-26 03:12:57

标签: ruby-on-rails cancan

我正在使用CanCan进行授权。下面的代码按照我打算用户的方式工作,即它允许非管理员用户查看他们自己的页面而不是其他用户的页面。但是,定义成绩簿能力的行允许访问用户的成绩簿(这是与属于用户的成绩簿的一对一关系)以及能够查看其他用户的成绩簿。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.has_role? :admin
      can :manage, :all
    else
      can :read, User, :id => user.id
      can :read, Gradebook, :user_id => user.id
    end
  end
end

CanCan文档包含以下示例:

can :read, Project, :active => true, :user_id => user.id

这似乎为我正在尝试做的事情提供了一个模型,但我无法让CanCan阻止访问其他用户的成绩簿,同时允许访问用户自己。 我也尝试了以下内容:

cannot :read, Gradebook do |book|
  book.user_id != user.id
end

但是这会阻止访问任何成绩簿。我也试过无数其他的排列无济于事。

2 个答案:

答案 0 :(得分:0)

我的应用中有这样的代码,效果很好。你可以尝试一下:

def initialize(user)
  user ||= User.new
  if user.has_role? :admin
    can :manage, :all
  else
    can :read, user
    can :read, Gradebook, user: user
  end
end

答案 1 :(得分:0)

我明白了。它与Gradebook是嵌套资源这一事实有关。在成绩簿控制器中,我最初刚刚调用了load_and_authorize_resource,但我将其更改为:

load_and_authorize_resource :user
load_and_authorize_resource :gradebook, :through => :user, :singleton => true

然后在我的能力档案中我使用了这个:

  can :read, Gradebook, :user => { :id => user.id }

现在它的行为符合要求。