筑巢还是不筑巢?

To Nest or Not to Nest?

提问人:Anthony 提问时间:10/3/2008 最后编辑:blankAnthony 更新时间:1/27/2009 访问量:848

问:

前提:通常在准备一个新的 Ruby on Rails 应用程序时,我会绘制出有关用户导航的模型和关系。通常我会遇到一个我需要问自己的地方,我是否应该超越通常的“经验法则”,即嵌套不再深 1 层。有时我觉得有必要嵌套,而不是创建另一个命名空间路由并重复工作。
下面是一个示例:

模型:用户、公司、位置
用户拥有并属于许多公司(多对多) 用户拥有并属于许多位置(多对多) 公司拥有并属于许多位置(多对多)


路由: 1 级嵌套用户/:user_id/companies/ - 列出与用户相关的所有公司 users/:user_id/locations/ - 列出与用户相关的所有位置 超过 1 级嵌套

用户/:user_id/companies/:
company_id/locations/ - 列出用户

的所有公司位置

所以,我的问题是,在 RoR 中嵌套超过 1 级是否合适?是或否?为什么?

Ruby-on-rails 红宝石 嵌套

评论


答:

7赞 Mike Breen 10/3/2008 #1

我倾向于听从杰米斯·巴克(Jamis Buck)的建议,从不筑巢超过一层。

编辑: 如果您要嵌套超过 1 个级别,我会查看 Edge 中新的浅层路线功能

评论

0赞 Otto 2/1/2009
浅层路线 FTW。这几乎可以肯定是你想要的。LocationsController#index 与 /locations 没有意义,因为您永远不需要 /all/ 位置。但它允许您将所有位置保留在 /locations/<id>无论它与哪种类型相关联。
2赞 Orion Edwards 10/3/2008 #2
users/:user_id/companies/:company_id/locations/

虽然从技术上讲这很好,但命名的路由帮助程序不会因此而成为

user_company_location_path( user_id, company_id, location_id )

像这样必须推车第 3 轮参数很烦人。任何烦人的事情都可能是一个危险信号。

评论

0赞 webmat 10/3/2008
查看resource_controller smart_url: smart_url(@user, @company, @location).但是,是的,嵌套太深似乎是错误的。
1赞 Dave Smylie 10/3/2008 #3

虽然这在理论上听起来不错,但我发现嵌套多个级别可能会开始变得令人困惑 - 特别是如果你在不同的级别上有相同的命名控制器(这可能很常见)

例如

  user/x/blog/y/profile/z, and
  user/x/profile/a

我经常会发现我在一个与我认为我正在工作的命名空间不同的命名空间中工作。如果他们做相似但不同的事情,可能会变得很混乱=)

我当前的应用程序,我上周浏览并删除了大部分嵌套路由。 (当然是YMMV)