假设我的应用有两个模型,即Foo和Bar。

Foo可选地归属于Bar。

现在,我可以查看单个Foo,或搜索特定的Foo,FoosController可以处理所有这些。我的网址是:
foos/1foos/new

有时我想看看酒吧。 BarsController可以处理此问题,而我可以像这样:
bars/1bars/1/edit

如果我正在查看一个酒吧,则可能要浏览该酒吧中所有的Foos。因此,我想使用bars/1/foos/来查看那些Foos。

使用嵌套资源,这非常简单,看起来像这样:

resources :foo
resources :bar do
  resources :foo
end


但是,作为酒吧一部分的Foos与常规的Foos有所不同。因此,例如,如果加载foos/1bars/1/foos/1,则我将查看同一Foo,但是在每种情况下,我专注于不同的信息。

因此,我一直在考虑让BarFoos控制器在Bar上下文中处理Foos。但是,如果将BarFoos嵌套在Bar下,那么我的助手将像bar_bar_foos_pathnew_bar_bar_foo_path一样。这似乎是多余的。

因此,现在我正在考虑名称空间,这是我以前从未研究过的。我在rails指南中看到可以定义的内容:

namespace "bar" do
  resources :foos
end


如果这样做,我可以在FoosController下创建第二个app/bar/,并且FoosController可以使用诸如bar_foo_path(:id)而不是bar_bar_foo_path(:id)这样的好助手在Bar内部处理Foos。

但是,如果我这样做了,我的BarsController会怎样?如果我有BarsController而不是resources :bars,如何将请求路由到namespace "bar"

最后,我在二级FoosController中需要做些特别的事情来确保与顶层FoosController不会发生名称冲突吗?我意识到路由显示“命名空间”,但是其余的ruby代码如何知道app/bar/foos_controllerapp/foos_controller不是同一类?

谢谢!

最佳答案

我认为您要实现的目标是:


酒吧有很多人
查看属于Bar的Foos
查看所有Foos,无论其父级如何。


您可以通过以下方法实现:
route.rb:

resources :foos
resources :bars do
  resources :foos, :controller => 'bars/foos'
end


您最终得到的路由助手是:


bars_path
foos_path
bars_foos_path
等等,其余的都是“耙路”
=)


本质上,您最终得到:


app / BarsController(rails g控制器栏)
app / FoosController(rails g controller foos)
app / bars / FoosController(rails g控制器bars / foos)


在FoosController中,您将像往常一样使用以下命令访问foos:

@foos = Foos.all


在bar / FoosController中,您可以使用以下命令访问bar的foos:

@foos = @bar.foos


可以使用以下命令在bar / foos控制器中预先检索bar:

before_filter :get_client

private
def get_client
  @bar = Bar.find(params[:bar_id])
end


希望这可以帮助。 =)

编辑:
至于命名空间路由,当我从子路径中检索某些资源时,我就亲自使用它们。例如,如果我的网站上有一个“管理”部分,则可能具有以下内容:

route.rb:

namespace :admin do
  resources :foos
end


然后使用以下命令创建控制器:

rails g controller admin/foos


这将设置我的foos资源,以便我可以在“我的网站网址” / admin / foos中访问它,并获得诸如admin_foos_path之类的帮助器。

08-26 11:27