ruby-on-rails – Rails命名空间与嵌套资源

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails命名空间与嵌套资源前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我的应用有两个模型,Foo和Bar.

可以选择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之类的帮助者.

猜你在找的Ruby相关文章