2008-10-02 85 views
11

前提条件: 通常在准备新的Ruby on Rails应用程序时,我会绘制有关用户导航的模型和关系。通常我会碰到一个我需要问自己的地方,我是否应该超越通常的“嵌套规则”,不超过1层。有时我觉得需要嵌套,而不是创建另一个命名空间路线和复制工作。
下面是一个例子:
巢或不巢?

型号:用户,公司,地点
用户拥有属于许多公司(多对多)
用户拥有属于许多地方(多对多)
公司拥有属于许多地方(多对多)

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

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

回答

7

我倾向于追随贾米斯巴克的advice,永远不会筑巢超过一层。

编辑: 如果你要嵌套超过10级我会边检查出shallow routes新功能

+0

FTW的浅路线。这几乎可以肯定你想要的。 LocationsController#索引与/位置无关,因为你永远不需要/所有/位置。但它可让您保留/ locations/上的所有位置,而不管它与哪种类型相关联。 – Otto 2009-01-31 17:37:06

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

虽然在技术上,这是好的,也不会指定路线帮手因此是

user_company_location_path(user_id, company_id, location_id) 

不得不购买轮3参数,这是令人讨厌的。任何恼人的事情可能都是一面红旗。

+0

检查resource_controller中的smart_url:smart_url(@user,@company,@location)。但是,嵌套太深,似乎是错误的。 – webmat 2008-10-03 13:01:46

1

虽然它在理论上听起来不错,我发现嵌套多个级别可以开始会比较混乱 - 特别是如果你有不同级别的同名控制器(这是相当常见的)

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

我经常会发现我在不同的命名空间来什么,我觉得我的工作的工作。如果他们这样做相似,但不同的东西,它可以变得相当混乱=)

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