可以选择belongs_to吧.
现在我可以看一个单一的Foo,或者搜索一个特定的Foo,而FoosController可以处理所有这些.我的网址如下:
foos / 1和foos / new
有时我想看一下吧. BarsController处理它,我得到它像:
酒吧/ 1或酒吧/ 1 /编辑.
如果我正在看酒吧,我可能想浏览所有那些属于该酒吧的Foos.所以,我想使用酒吧/ 1 / foos /来看这些Foos.
这是非常简单的嵌套资源,它看起来像这样:
resources :foo resources :bar do resources :foo end
然而,作为酒吧一部分的Foos是特别的,与正规Foos不同.所以,例如,如果我加载foos / 1或bars / 1 / foos / 1,我会看着同样的Foo,但是我在每一种情况下专注于不同的信息.
所以我一直在想一个BarFoos控制器来处理Foos,当他们在一个酒吧的情况下.但是,如果我将BarFoos嵌入到Bar下,那么我的助手将会像bar_bar_foos_path和new_bar_bar_foo_path一样.这似乎是多余的.
所以,现在我正在考虑命名空间,这是我之前从来没有看过的.我在导轨指南中看到我可以定义:
namespace "bar" do resources :foos end
如果我这样做,我可以在app / bar /下做一个FoosController,并且FoosController可以使用像bar_foo_path(:id)而不是bar_bar_foo_path(:id)的好帮手处理一个Bar里面的Foos.
但是如果我这样做,我的BarsController会发生什么?如果不是资源,请求如何路由到BarsController:bars我有命名空间“bar”?
最后还有什么特别的,我需要在我的第二个FoosController里做,以确保没有与顶级FoosController的名字冲突?我意识到路由说“命名空间”,但是其余的ruby代码如何知道app / bar / foos_controller和app / foos_controller不是同一个类?
谢谢!
解决方法
>酒吧有很多Foos
>查看属于酒吧的Foos
>查看所有的Foos,无论父母.
您可以通过以下方式实现:
routes.rb中:
resources :foos resources :bars do resources :foos,:controller => 'bars/foos' end
你最终的路线帮助者是:
> bars_path
> foos_path
> bars_foos_path
>等,其他的“耙子路线”
=)
实质上,你最终得到:
> app / BarsController(rails g controller bar)
> app / FoosController(rails g controller foos)
> app / bars / FoosController(rails g controller bars / foos)
在FoosController中,您将像往常一样访问foos:
@foos = Foos.all
在酒吧/ FoosController中,您可以访问酒吧的foos:
@foos = @bar.foos
其中bar可以在bars / foos控制器中预先检索:
before_filter :get_client private def get_client @bar = Bar.find(params[:bar_id]) end
希望这可以帮助. =)
编辑:
对于命名空间的路由,当我从子路径中检索到一些资源时,我亲自使用它们.例如,如果我的网站有一个管理员部分,那么我可能会有以下几点:
routes.rb中:
namespace :admin do resources :foos end
我创建了我的控制器:
rails g controller admin/foos
这设置了我的foos资源,以便我可以在“我的网站url”/ admin / foos访问它,并且还可以获得诸如admin_foos_path之类的帮助者.