2

我的应用程序有 2 个角色:编辑者和管理员。我希望编辑拥有一些权限,而管理员拥有所有编辑权限以及其他一些权限。

这是我的摘录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

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

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

但是,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
4

2 回答 2

2

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

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

if user.is_editor?
  can :read, Post
end
于 2010-07-30T14:55:57.447 回答
0

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

can [:edit, :read], Post
于 2010-07-30T14:48:18.933 回答