我有一个名为Contributor
的模型,它也可以作为其他几个模型的命名空间,例如Contributor::Alias
和Contributor::Reassignment
。我想使用包含贡献者ID的URL,如下所示:
/contributors/1/reassignments/new
但是我收到了这个错误:
No route matches [GET] "/contributors/1/reassignments/new"
我的routes.rb
文件包含:
namespace :contributor do
resources :reassignments
end
resources :contributors
我也试过了:
resources :contributors do
resources :reassignments
end
这会导致不同的错误:
uninitialized constant ReassignmentsController
知道如何处理这个问题吗?也许我不应该使用也充当模型的命名空间?我没有在任何教程中看到过这种情况,尽管它似乎有可能。
更新:
如何处理深度嵌套的命名空间模型,例如:
resources :contributors do
resources :reassignments, :module => "contributor" do
resources :approvals, :module => "reassignment"
end
end
使用这种方法,我收到错误:
No route matches {:action=>"create", :controller=>"contributor/reassignment/approvals"}
我的控制器目录确实具有以下结构:
contributor ->
reassignment ->
approvals_controller.rb
这似乎与第一个错误有关,但也许它是新的东西。
答案 0 :(得分:1)
目前尚不清楚您是否拥有贡献者资源。如果您这样做,您的routes.rb中的以下内容:
resources :contributors do
resources :reassignments, :module => "contributor"
end
如果没有,请尝试:
resources :reassignments, :module => "contributor", :path => "/contributors/:contributor_id/reassignments"
请注意,在第二种情况下,您需要构建一个url并在调用link_to,form_for和类似位置时显式传递:contributor_id。
如果你想使用[@fortributor,@ reassignment]格式,那么你最好坚持第一种方法,即yu有一个贡献者资源。
更新:对于三级嵌套,如果您的控制器目录也没有与资源并行嵌套,您可以明确指定控制器,例如:
resources :contributors do
resources :reassignments, :controller => "contributor/reassignments" do
resources :approvals, :controller => "reassignment/approvals"
end
end
但是,请不要这样做。在Rails中积极阻止3级和更多级别的嵌套。请在此处查看建议内容:http://weblog.jamisbuck.org/2007/2/5/nesting-resources