2017-05-28 5 views
1

私は作業能力を定義した下記のように:Cancancanネストされたリソースの認可

routes.rbを

resources :projects do 
    resources :tasks 
end 

can [:manage], Project, invites: {supplier: {:user_id => user.id}} 
can [:new, :create], Task 
can [:update, :show, :destroy, :edit], Task, user_id: user.id 

ability.rbタスクコントローラ:

load_and_authorize_resource :project 
load_and_authorize_resource :task, :through => :project 

これにより、ユーザーがプロジェクトに招待された場合、タスクを作成します。

ただし、ユーザーがプロジェクトを管理できないようにする必要があります。私は、以下のようにプロジェクトのインデックスを作成できるようにする必要があります。

私は上記の能力に入れ

can [:index], Project, invites: {supplier: {:user_id => user.id}} ## breaks when changing :manage to :index here 
can [:new, :create], Task 
can [:update, :show, :destroy, :edit, :index], Task, user_id: user.id 

ability.rb、ユーザーはもはやアクセスは、タスク上の任意のアクションを実行することができますか。私はどのようにしてプロジェクトにタスク能力をつけ、プロジェクトに:索引能力を与えるだけですか?

+0

をすることができます抽出して条件を簡素化することができます、プロジェクト、誘う:{サプライヤー:{USER_ID:user.idを}} [インデックス]は、' - しかし、あなたは本当に複雑さの点ですPunditはCanCanCanよりはるかに優れた選択肢です。 – max

+0

真。これは認証に必要な最後の部分です。再構築を避けることができるかどうかを確認する。 – HoosierCoder

答えて

0

招待されたときに、ユーザーはreadプロジェクトを作成できると定義してください。したがって:

招待された場合、ユーザーは、プロジェクトを読み込むことができます(私は条件invites: { supplier: { user: user} }が招待されたユーザーが定義されて推測)

can :read, Project, invites: { supplier: { user: user} } 

その後、ユーザーは、彼が持っているにプロジェクトのためのタスクを作成することができることを言わなければなりませんその後、招待:

ユーザーがに彼が彼の招待プロジェクトで自分のタスクを管理できることを定義し、最後に
can [:new, :create], Task, project: { invites: { supplier: { user: user} } } 

can :manage, Task, user: user, project: { invites: { supplier: { user: user} } } 

また `

invited_to = { invites: { supplier: { user: user} } } 
can :read, Project, invited_to 
can [:new, :create], Task, project: invited_to 
can :manage, Task, user: user, project: invited_to 
+0

ほとんどの場合、私はこの役割のためにプロジェクトでカスタムアクション(1つのメソッド)を定義できる必要があります。したがって、あまりにも多くの権限を割り当てるものとして 'Project'に対して' read'と ':manage'を避けなければなりません。私はプロジェクトの認証を一括して取り出すことができましたが、 'can:manage、Task、user:user'を実行すると、ユーザーはURLハッキングで招待されなかったプロジェクトの下でタスクを作成できます。 – HoosierCoder

+0

':read'は':index'と ':show'を与えているので、あなたのプロジェクトでは大丈夫です。 2点目については私の答えを更新しました。 – coorasse

+0

ええ、私はプロジェクトのための 'show'パーミッションを与えてしまい、ロールによってページを制限しました。 – HoosierCoder

関連する問題