2012-05-11 78 views
1

您使用什麼標準來決定是否嵌套資源?在Rails中選擇嵌套資源的最佳實踐?

過去,我選擇嵌套時,如果沒有對相關資源(父級)進行範圍限制,對資源的索引操作就沒有意義。

即使在我編寫上述標準時,我也意識到它至多不明確。

一位同事說:

巢資源,因爲它抓住了關聯模型可視化的URL結構的關係......它可以很容易地修改URL,回到剛纔的帖子。如果我看到/ posts/123/offers/555 - 我知道我可以去/ posts/123查看我的帖子。就像我剛剛看到/ offer/555一樣,除了手動瀏覽網站之外,我無法回到帖子。

對我來說,用戶的URL的操作應該對應用程序的體系結構沒有影響,並且對飛行就我所知是普遍持有的原則,即嵌套的資源應該如果在所有可能避免。另外,這個論點似乎支持多層次的嵌套,這也是我讀過的每篇文章都建議的。

你有什麼經驗?

回答

0

我嵌套的路線,就像你先說的那樣,後面的路線在沒有前者的情況下是沒有意義的。對博客的評論可嵌套在resources articles之下,因爲雖然也許你想在自己的頁面上顯示個人評論(誰知道爲什麼......),評論屬於一篇文章。

這也有控制器的實現。如果你知道這篇文章,那麼你可以在文章中找到具體的評論範圍。這使得查詢更有效。

此外,你的同事是正確的,你必須處理用戶與你的路線搞亂,儘管他有錯誤的原因。這不是爲了他們的方便,而是爲了他們的安全。

讓我們來看一個帶有用戶和訂單的類似亞馬遜的應用程序。如果我在users/5/orders/2那麼我認爲「嘿,我可以將這5改爲4,然後看看其他人的命令!」如果您沒有對訂單進行範圍限定,那麼授權用戶查看orders/2的控制器級邏輯變得更加棘手。對用戶的範圍允許在訂單控制器中使用current_user.orders.find(params[:id])。可以根據身份驗證找到當前用戶,以便他們不僅可以交換URL中的ID併成爲其他人。

+1

您的亞馬遜樣例沒有真正說明嵌套路線的價值。如果你正在執行current_user.orders,那麼users/5/orders/2中的「users/5」是完全多餘的。所以我真的不知道這是一個安全的例子。/orders/2可能會做同樣的事情:current_user.orders.find(params [:id])...所以我不明白這一點。我更傾向於認爲這是一個嵌套路線不合適的例子,因爲它根本沒有價值。 – patrick