使用CanCan可以相加地定义权限

时间:2010-07-21 18:58:14

标签: ruby-on-rails cancan

我的应用程序有两个角色:编辑器和管理员。我希望编辑有一些权限,管理员要拥有所有编辑权限和一些其他权限。

以下是我ability.rb

的摘录
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_admin?
      can :edit, Post
    end

    if user.is_editor?
      can :edit, Post, :created_by_id => user.id
      can :read, Post
    end
  end
end

由于所有管理员也是编辑,我希望这会定义这些权限:

  • 管理员可以阅读和编辑所有帖子
  • 编辑可以阅读所有帖子,但只能修改他们创建的帖子

然而,CanCan似乎并没有附加地定义权限 - 即,当CanCan发现用户是编辑者时(即使用户是管理员),它会应用更具限制性的权限(即can :edit, Post, :created_by_id => user.id代替can :edit, Post)。

这有什么办法吗?显而易见的解决方案需要重复代码:

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_admin?
      can :edit, Post
      can :read, Post # NOT DRY!!!
    elsif user.is_editor?
      can :edit, Post, :created_by_id => user.id
      can :read, Post
    end
  end
end

2 个答案:

答案 0 :(得分:2)

您是否尝试使用块进行授权?

can :edit, Post do |post|
 post.created_by_id == user.id || user.is_admin?
end

if user.is_editor?
  can :read, Post
end

答案 1 :(得分:0)

为什么不重新定义编辑别名?你也可以这样做:

can [:edit, :read], Post