Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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 遗传资源和CanCan 3层嵌套_Ruby On Rails_Ruby_Cancan_Nested_Inherited Resources - Fatal编程技术网

Ruby on rails 遗传资源和CanCan 3层嵌套

Ruby on rails 遗传资源和CanCan 3层嵌套,ruby-on-rails,ruby,cancan,nested,inherited-resources,Ruby On Rails,Ruby,Cancan,Nested,Inherited Resources,我有一个问题,在CanCan结合继承资源的3层嵌套模型。我曾读到,我们应该将所有内容嵌套到两个级别,但我必须将所有内容放在帐户模型下,现在我尝试在CanCan中这样做: load_and_authorize_resource :account load_and_authorize_resource :project, :through => :account load_and_authorize_resource :model, :through => :project 这给了我一

我有一个问题,在CanCan结合继承资源的3层嵌套模型。我曾读到,我们应该将所有内容嵌套到两个级别,但我必须将所有内容放在
帐户
模型下,现在我尝试在CanCan中这样做:

load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project
这给了我一个@account变量,它的值是@project,就像它正在覆盖它一样@项目是应该的,也是@model。是我的错,CanCan的错,继承的资源还是CanCan不支持三层嵌套?此外,我在IR中为ModelsController执行此操作

belongs_to :account, :finder => :find_by_name! do
  belongs_to :project, :finder => :find_by_name!
end
另一件奇怪的事情是当我从CanCan的定义中删除零件
load\u和
。然后它就可以工作了,但我已经读到不使用
load
部件可能会很危险


我可以只使用
授权资源吗
或者我应该对CanCan做些什么吗?

据我所知,您的授权是正确的

CanCan gem的开发者ryan发布了这一行为:

这意味着你的

load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project
将在这样的块中结束(此处:创建操作。对于其他操作,应最后授权!和@model更改):

我希望这个答案可以帮助开发人员寻找嵌套的cancan授权:-)

资料来源:


ps:accounts/1/projects/2/models/new的错误行为:

load_and_authorize_resource :project
load_and_authorize_resource :model, :through => :project
这是一种安全问题,因为这样就可以了

@project=project.find(参数[:project\u id]) [……]

,并且不检查当前帐户是否允许读取链接帐户“1”。
它不会检查项目“2”是否真的是帐户“1”的项目。

我不知道CanCan支持多少级别,但您可以自己加载,然后只调用
authorize\u resource
方法。您可以使用authorize\u资源,只需确保在authorize\u资源之前使用before\u过滤器进行加载即可。
load_and_authorize_resource :project
load_and_authorize_resource :model, :through => :project