は、私はカンカンをお勧めします。ちょうど私の2セント。
例(未テスト、残念ながら私はここでテストすることはできませんし、私は自分のコードにアクセス全くない)
それでは、私たちはこのような構造を持っているとしましょう:
class User < ActiveRecord::Base
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :users
# attributes: project_read, project_create, project_update
end
その後、カンカンが見ることができます
class Ability
include CanCan::Ability
def initialize(user)
@user = user
@role = user.role
# user can see a project if he has project_read => true in his role
can :read, Project if role.project_read?
# same, but with create
can :create, Project if role.project_create?
# can do everything with projects if he is an admin
can :manage, Project if user.admin?
end
end
必要な情報はすべて、githubのCanCan wikiで見つけることができます。個人的な勧告は読むために:
は、基本的にはあなたは自分の関係を通して、あなたの役割が含まれるように上記の例を拡張する必要があります。簡単にするために、ability.rb
に追加のヘルパーメソッドを作成することもできます。あなたは(少なくとも私は)のために落ちることがあり
メイン平均警告:あなたはどのようなユーザーことはできませんを定義する前ががモデルで何かを行うことができ、ユーザーを確認してください。さもなければ、あなたは挫折して座って、「なぜ?私は決してユーザーを書くことはできませんでした」と思うでしょう。うん。しかし、あなたはまた、明示的に...彼ができることを書いたことはありません
CanCanでは、条件付きブロックを介して能力を定義できます - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks。 –
1. TeamMembersには多くのユーザー、ロールがあります 2.チームには多数のTeamMembersがあります 3.チームにはチームが1人あります... 上記の設定では、プロジェクトの特定のインスタンスをフィルタリングする手段はありません。あなたはそれができると思うなら...あなたは私に、前もって感謝します。 –