Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 仅当当前用户与项目关联时,才能允许操作_Ruby On Rails_Ruby On Rails 4_Cancan - Fatal编程技术网

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我刚刚编辑过。。。对不起,谢谢,但我找到了一个更干净的解决办法,也许更好。