Rails中的浅路由3

JP *_*shy 3 ruby-on-rails

在我的rails 3应用程序中使用我的路线时,我希望有这样的浅路线:

/san-francisco/union-square
Run Code Online (Sandbox Code Playgroud)

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

/cities/san-francisco/neighborhoods/union-square
Run Code Online (Sandbox Code Playgroud)

我用它来做我的 routes.rb

shallow do
  resources :cities do
    resources :neighborhoods do
      resources :locations
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但我仍然有这个:

city_neighborhood_locations GET  /cities/:city_id/neighborhoods/:neighborhood_id/locations(.:format)
Run Code Online (Sandbox Code Playgroud)

不应该看起来像:

city_neighborhood_locations GET  /:city_id/:neighborhood_id/:id(.:format)
Run Code Online (Sandbox Code Playgroud)

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

link_to neighborhood.name, [:city, neighborhood]
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*ker 12

你正在寻找的东西通常不被称为"浅路由".

正如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
Run Code Online (Sandbox Code Playgroud)

没有浅路由,最后一条路线将是:

city_neighborhood          GET  /cities/:city_id/neighborhoods/:neighborhood_id
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

match ":city_id", :controller => "cities", :action => "show"
match ":city_id/:neighborhood_id", :controller => "neighborhoods", :action => "show"
Run Code Online (Sandbox Code Playgroud)

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

  • +1 - `resources`处理这个问题,你只需指定`:path =>'/:city_name'`或类似的.嵌套仍然有效,所以你可以拥有`resources:users,:path =>'/:username'{resources:posts,:path =>':/ post_slug'}`,为你提供像`/ coreyward/foo这样的路由-bar`使用`username`参数和`post_slug`参数路由到`PostsController`. (2认同)