CancanCan嵌套资源授权
Cancancan nested resource authorization
我的工作能力定义如下:
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
如果用户受邀加入项目,这可以正确地让他们创建任务。
但是,我不希望用户能够 :manage 项目。我只需要用户能够如下索引项目。
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能力?
您可能应该定义用户在受邀时可以 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
我的工作能力定义如下:
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
如果用户受邀加入项目,这可以正确地让他们创建任务。
但是,我不希望用户能够 :manage 项目。我只需要用户能够如下索引项目。
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能力?
您可能应该定义用户在受邀时可以 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