0

認証にCanCanを使用しています。以下のコードは、私がユーザーに対して意図したとおりに機能しています。つまり、管理者以外のユーザーは自分のページを表示できますが、他のユーザーのページは表示できません。ただし、Gradebook 機能を定義する行では、ユーザーの Gradebook へのアクセス (ユーザーに属する Gradebook との has-one 関係) と、他のユーザーの gradebook の表示の両方が許可されます。

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

ただし、これにより成績表へのアクセスが妨げられます。また、無数の他の順列を試してみましたが、役に立ちませんでした。

4

2 に答える 2

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
于 2013-04-26T03:29:35.960 に答える