【发布时间】:2011-07-06 19:28:35
【问题描述】:
假设我的应用有两个模型,Foo 和 Bar。
Foo 可选belongs_to Bar。
现在我可以查看单个 Foo,或搜索特定的 Foo,而 FoosController 会处理所有这些。我的网址是这样的:
foos/1 和 foos/new
有时我想看看酒吧。 BarsController 处理它,我像这样处理它:
bars/1 或 bars/1/edit。
如果我正在查看一个 Bar,我可能想浏览属于该 Bar 的所有 Foo。所以,我想用bars/1/foos/ 来看看那些Foos。
这对于嵌套资源来说非常简单,看起来像这样:
resources :foo
resources :bar do
resources :foo
end
但是,作为 Bar 一部分的 Foo 有点特殊,与常规 Foo 不同。因此,例如,如果我加载 foos/1 或 bars/1/foos/1,我会查看相同的 Foo,但在每种情况下我都关注不同的信息。
所以我一直在考虑让 BarFoos 控制器在 Bar 的上下文中处理 Foos。但是,如果我将 BarFoos 嵌套在 Bar 下,那么我的助手将类似于 bar_bar_foos_path 和 new_bar_bar_foo_path。这似乎是多余的。
所以,现在我正在考虑命名空间,这是我以前从未研究过的。我在 Rails 指南中看到我可以定义:
namespace "bar" do
resources :foos
end
如果我这样做,我可以在app/bar/ 下创建第二个FoosController,并且 FoosController 可以使用像 bar_foo_path(:id) 这样的好帮手而不是 bar_bar_foo_path(:id) 来处理 Bar 内的 Foos。
但如果我这样做,我的BarsController 会发生什么?如果我有namespace "bar" 而不是resources :bars,请求如何路由到BarsController?
最后,我需要在我的辅助 FoosController 中做些什么特别的事情来确保与顶级 FoosController 没有名称冲突吗?我意识到路由说“命名空间”,但是其余的 ruby 代码如何知道 app/bar/foos_controller 和 app/foos_controller 不是同一个类?
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 namespaces routes nested-resources