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

すべての管理者は編集者でもあるため、これでこれらの権限が定義されることを望みました。

  • 管理者はすべての投稿を閲覧および編集できます
  • 編集者はすべての投稿を読むことができますが、自分が作成した投稿のみを変更できます

ただし、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 に答える