Cancancan嵌套资源授权

时间:2017-05-28 18:53:53

标签: ruby-on-rails cancan cancancan

我的工作能力定义如下:

的routes.rb

resources :projects do
  resources :tasks
end

ability.rb

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

任务控制器:

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

如果邀请他们加入项目,这可以让用户正确创建任务。

但是,我不希望用户能够:管理项目。我只需要用户能够将项目索引如下。

ability.rb

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

当我输入上述功能时,用户将无法再访问或执行任务上的任何操作。如何通过项目创建任务能力,只为项目提供:index能力?

1 个答案:

答案 0 :(得分: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