假设我的应用程序有两个模型,Foo 和 Bar。
Foo 可选belongs_to Bar。
现在我可以查看单个 Foo,或者搜索特定的 Foo,而 FoosController 会处理所有这些。我的网址是这样的:foos/1
和 foos/new
有时我想看看一个酒吧。 BarsController 处理这个,我得到它像:bars/1
或 bars/1/edit
.
如果我正在查看 Bar,我可能想浏览属于该 Bar 的所有 Foos。所以,我想使用 bars/1/foos/
看看那些 Foos。
这对于嵌套资源非常简单,它看起来像这样:
resources :foo
resources :bar do
resources :foo
end
但是,作为 Bar 一部分的 Foos 有点特殊,与常规 Foos 不同。因此,例如,如果我加载
foos/1
或 bars/1/foos/1
,我会看同一个 Foo,但我在每种情况下都关注不同的信息。所以我一直在考虑让 BarFoos Controller 在 Bar 上下文中处理 Foos。但是,如果我将 BarFoos 嵌套在 Bar 下,那么我的助手将类似于
bar_bar_foos_path
和 new_bar_bar_foo_path
.这似乎是多余的。所以,现在我正在考虑命名空间,这是我以前从未研究过的。我在 Rails 指南中看到我可以定义:
namespace "bar" do
resources :foos
end
如果我这样做,我可以再做一次
FoosController
下 app/bar/
, 并且 FoosController 可以通过像 bar_foo_path(:id)
这样的好 helper 处理 Bar 内的 Foos而不是 bar_bar_foo_path(:id)
.但如果我这样做,我的
BarsController
会发生什么? ?请求如何路由到 BarsController
如果不是 resources :bars
我有 namespace "bar"
?最后,我需要在我的辅助 FoosController 中做什么特别的事情来确保与顶级 FoosController 没有名称冲突吗?我意识到路由说“命名空间”,但是其余的 ruby 代码如何知道
app/bar/foos_controller
和 app/foos_controller
不是同一个类吗?谢谢!
最佳答案
我认为你想要实现的是:
您可以通过以下方式实现:
路线.rb:
resources :foos
resources :bars do
resources :foos, :controller => 'bars/foos'
end
您最终得到的路线助手是:
=)
从本质上讲,您最终会得到:
在 FoosController 中,您可以像往常一样访问 foos:
@foos = Foos.all
在 bar/FoosController 中,您可以使用以下命令访问 bar 的 foos:
@foos = @bar.foos
其中 bar 可以在 bar/foos Controller 中预先检索:
before_filter :get_client
private
def get_client
@bar = Bar.find(params[:bar_id])
end
希望这可以帮助。 =)
编辑 :
至于命名空间路由,当我从子路径检索一些资源时,我个人使用了它们。例如,如果我的网站有一个管理部分,那么我可能有以下内容:
路线.rb:
namespace :admin do
resources :foos
end
我创建了我的 Controller :
rails g controller admin/foos
这将设置我的 foos 资源,以便我可以在“我的站点 url”/admin/foos 中访问它,并且还可以获取诸如 admin_foos_path 之类的帮助程序。
关于ruby-on-rails - Rails 命名空间与嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160021/