【问题标题】:Shallow routing in Rails 3Rails 3 中的浅层路由
【发布时间】:2011-11-19 01:16:30
【问题描述】:

在我的 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,对此的任何帮助都会非常有帮助!

【问题讨论】:

  • 嵌套资源仍然使用资源的名称,不确定是什么让您相信。不确定 link_to 的事情,不会发生在我身上。

标签: ruby-on-rails


【解决方案1】:

您要查找的内容通常不称为“浅层路由”。

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 命名路由的方式。

【讨论】:

  • +1 — resources 处理得很好,您只需指定 :path => '/:city_name' 或类似名称。嵌套仍然有效,一切正常,因此您可以拥有resources :users, :path => '/:username' { resources :posts, :path => ':/post_slug' },为您提供像/coreyward/foo-bar 这样的路由,该路由带有username 参数和post_slug 参数。
  • 感谢@coreyward 的提示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2021-07-18
  • 2011-03-09
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多