Ruby on rails 仅当当前用户与项目关联时,才能允许操作
我正在使用Ruby on rails 仅当当前用户与项目关联时,才能允许操作,ruby-on-rails,ruby-on-rails-4,cancan,Ruby On Rails,Ruby On Rails 4,Cancan,我正在使用cancan进行授权,我想基于多对多关系做出一些限制 实体 User - has_many project_assignments User - has_many projects, through: :project_assignments User - has_many roles, through: :project_assignments 项目分配:用户id、项目id、角色id 我想让用户能够对项目和玩具模型执行完整的CRUD,前提是该项目是由用户创建的。玩具嵌套在项
cancan
进行授权,我想基于多对多关系做出一些限制
实体
User - has_many project_assignments
User - has_many projects, through: :project_assignments
User - has_many roles, through: :project_assignments
项目分配:用户id、项目id、角色id
我想让用户能够对项目和玩具
模型执行完整的CRUD
,前提是该项目是由用户创建的。玩具嵌套在项目下
Toy有许多项目
和Project有许多玩具
通过ProjectToy
if user.role? :moderator
can :crud, [Project, Toy]
end
我想我只需要限制
项目
,因为玩具
取决于项目id,我可以这样做吗 我会尝试对第二个多对多使用某种if语句:
can :crud, Project do |project|
ProjectAssignment.where(user_id: user.id, project_id: project.id).any?
end
can :crud, ProjectToy do |project_toy|
ProjectAssignment.where(user_id: user.id, project_id: project_toy.project.id).any?
if can? :crud, ProjectToy
can :crud, Toy do |toy|
ProjectToy.where(toy_id: toy.id).any?
end
end
end
PS-您可能需要小心使用:crud并将其替换为[:编辑,:更新,:销毁,:删除],然后为:创建提供一个单独的can,因为如果用户是第一次创建项目/玩具,那么系统将找不到任何与他/她相关的玩具或项目,并且不提供访问权限。我找到了一个解决方案:
在我的项目控制器中,我添加了:
通过::当前用户加载和授权资源
在我的玩具控制器中,我添加了:
通过::当前用户加载和授权资源项目
加载和授权资源:玩具,通过::项目
在我的能力档案中:
if user.role? :moderator
can :crud, :all or [Project, Toy]
end
一切正常,我已经为多个项目分配了一个用户,每个项目都有访问权限。不能这样做,因为玩具和项目有多对多的关系,所以是这样吗?用户->有很多->项目分配->属于->项目->有很多->项目关键字->属于->玩具屋就是这样。。ProjectToy,不是ProjectKeywords我刚刚编辑过。。。对不起,谢谢,但我找到了一个更干净的解决办法,也许更好。