问题 是巢还是不巢?


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

楷模: 用户,公司,位置
用户拥有并属于许多公司(多对多)
用户拥有并属于许多地点(多对多)
公司拥有并且属于许多地点(多对多)

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

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


7410
2017-10-02 20:48


起源



答案:


我倾向于跟随Jamis Buck的 忠告 并且从不嵌套多个深度。

编辑: 如果你要筑巢超过1级,我会检查新的 浅路 Edge中的功能


7
2017-10-02 22:11



浅路FTW。这几乎可以肯定你想要的。 LocationsController #index作为/位置没有意义,因为你永远不会想要/所有/位置。但它允许您将所有位置保留在/ locations / <id>,无论它与哪种类型相关联。 - Otto


答案:


我倾向于跟随Jamis Buck的 忠告 并且从不嵌套多个深度。

编辑: 如果你要筑巢超过1级,我会检查新的 浅路 Edge中的功能


7
2017-10-02 22:11



浅路FTW。这几乎可以肯定你想要的。 LocationsController #index作为/位置没有意义,因为你永远不会想要/所有/位置。但它允许您将所有位置保留在/ locations / <id>,无论它与哪种类型相关联。 - Otto


users/:user_id/companies/:company_id/locations/

虽然从技术上来说这很好,但是命名的路由助手也不会这样

user_company_location_path( user_id, company_id, location_id )

必须购买第3轮这样的参数是令人讨厌的。任何令人讨厌的东西都可能是一面红旗。


2
2017-10-02 22:19



检查resource_controller中的smart_url:smart_url(@ user,@ company,@ location)。但是,嵌套太深似乎是错误的。 - webmat


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

例如

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

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

我目前的应用程序,我去了上周,并删除了大多数嵌套路线。 (当然,YMMV)


1
2017-10-03 03:05