Rails 3:获取命名空间模型的ID

时间:2013-02-28 01:33:51

标签: ruby-on-rails routing namespaces

我有一个名为Contributor的模型,它也可以作为其他几个模型的命名空间,例如Contributor::AliasContributor::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

这似乎与第一个错误有关,但也许它是新的东西。

1 个答案:

答案 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