假设我的应用有两个模型,即Foo和Bar。
Foo可选地归属于Bar。
现在,我可以查看单个Foo,或搜索特定的Foo,FoosController可以处理所有这些。我的网址是:foos/1
和foos/new
有时我想看看酒吧。 BarsController可以处理此问题,而我可以像这样:bars/1
或bars/1/edit
。
如果我正在查看一个酒吧,则可能要浏览该酒吧中所有的Foos。因此,我想使用bars/1/foos/
来查看那些Foos。
使用嵌套资源,这非常简单,看起来像这样:
resources :foo
resources :bar do
resources :foo
end
但是,作为酒吧一部分的Foos与常规的Foos有所不同。因此,例如,如果加载
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
如果这样做,我可以在
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_controller
和app/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之类的帮助器。