2010-04-10 94 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深,它成爲一場噩夢...

嵌套是非常好的,如果它使事情變得更簡單。如果沒有,放棄它!