2010-04-10 93 views
6

我有点难以想出正确的答案,所以我会在这里请求我的问题。我正在研究一个RESTFul API。当然,我拥有多种资源,其中一些由父母与子女的关系组成,其中一些是独立的资源。我遇到困难的一点是如何让那些将建立客户端以对抗我的API的人变得更容易。Ruby on Rails URL(RESTful API)中的资源映射

情况是这样的。假设我有一个'街道'资源。每条街道都有多个房屋。 So Street:has_many到家和家园:belongs_to Street。如果用户想要请求对特定资源的家一个HTTP GET,下面应该工作:

http://mymap/streets/5/homes/10

,它允许用户以获取一个家庭信息与ID 10直线前进。我的问题是,我是通过向用户访问打破了本书的规则:

http://mymap/homes/10

技术上的那家资源自身存在的不街道。它使得感觉它存在作为它自己的实体没有封装街道,即使业务逻辑说,否则。

处理这个问题的最佳方法是什么?

编辑!本着成为一名优秀的StackOverflow公民的精神,我回来了一个支持的代码块,以了解如何在上面实现它们。

map.resources :streets, 
       :has_many => :homes 
       :shallow => true 

这将创建两种类型的路线,我一直在寻找。

+0

这个浅的选项很有趣。 – tadman 2010-04-11 05:53:49

回答

5

如果您的家庭记录只能属于一条街道,那么当您单独检查一个家庭时,关系不会混淆。无论出于何种原因,您仍然可以回溯到关联的街道记录。

这种情况下,如果您有多对多的关系,那么解嵌您的REST结构会使您陷入困境。如果一个特定的记录只在特定的情况下才有意义,并且你删除了这个上下文,那么显然会有混淆。

我认为在您的具体情况下,您可能不需要实现这两种方法,而是采用降低URL复杂性的“扁平”方法。

+3

如果你提供了这两个选项,你会希望确保在其中一个选项上使用'rel =“canonical”'链接到另一个。 (可能从较深的版本链接到较浅的版本。) – 2010-04-11 00:01:07

0

没有,那是多么浅的路线工作和使用了很多。

0

我真的很喜欢this的做法。我建议阅读它。总之这篇文章说,你不应该把你的资源嵌入到更高的层次上。如果嵌套资源可能变浅,那么就这样做。

在我的一个应用程序中,我真的搞砸了嵌套资源。我甚至去3或4深,它成为一场噩梦...

嵌套是非常好的,如果它使事情变得更简单。如果没有,放弃它!