Rails中的浅路由3

在我的rails 3应用程序中使用我的路线时,我想要像这样的浅路线:

/san-francisco/union-square 

但我的路由器坚持让他们这样:

 /cities/san-francisco/neighborhoods/union-square 

我已将它用于我的routes.rb

 shallow do resources :cities do resources :neighborhoods do resources :locations end end end 

但我仍然有这个:

 city_neighborhood_locations GET /cities/:city_id/neighborhoods/:neighborhood_id/locations(.:format) 

不应该看起来像:

 city_neighborhood_locations GET /:city_id/:neighborhood_id/:id(.:format) 

我不知道如何解决这个问题,另外我不确定我的链接有什么问题,我希望能够使用语法:

 link_to neighborhood.name, [:city, neighborhood] 

但是当请求到达控制器时,这似乎反转了:id:neighborhood_id ,对此的任何帮助都会非常有用!

你正在寻找的东西通常不被称为“浅路由”。

正如Rails定义的那样,浅层路由看起来像这样:

 city_neighborhoods GET /cities/:city_id/neighborhoods new_city_neighborhood GET /cities/:city_id/neighborhoods/new (create_city_neighborhood) POST /cities/:city_id/neighborhoods neighborhood GET /neighborhoods/:neighborhood_id 

没有浅路由,最后的路由将是:

 city_neighborhood GET /cities/:city_id/neighborhoods/:neighborhood_id 

浅路由允许您将资源嵌套在另一个资源(在本例中为城市下的邻域)下,但在不需要嵌套时为嵌套资源提供绝对/非嵌套路由。

当您使用依赖于父资源的ID的唯一标识符引用嵌套资源时,这是有意义的。 在你的例子中,这不是真的(在旧金山之外可能有一个“联合广场”;肯定会有像“唐人街”这样的重复),所以你可能希望这种情况下的浅路线。

你想要的是依赖于位置的路由,其中​​假定/固定资源的类型取决于它在URL中出现的位置。 (例如,根据您概述的计划,除了“邻居”之外,您不能拥有“城市”。)

我不认为默认情况下Rails resource(s)命令会支持它,但您可以使用手动match命令来执行此操作。 这不是我的头脑:

 match ":city_id", :controller => "cities", :action => "show" match ":city_id/:neighborhood_id", :controller => "neighborhoods", :action => "show" 

这仍然是RESTful /基于资源的,它只是不使用标准Rails命名路由的方式。