在Rails中,我有一個名爲item的模型。每個項目屬於類別(另一個模型),其中有一個名爲name的屬性。Rails在URL中動態重命名模型名稱
在尋求任何項目,我看到/ URL作爲/項目:ID
相反,我想的URL顯示爲/'item.category.name'/:id
例如如果該商品屬於名稱爲「鞋類」的類別,那麼我希望將該網址看作/ footwear /:id。如果有另一個屬於「服裝」類別的商品,那麼我希望將URL看作/ clothing /:id
這可能嗎?
在Rails中,我有一個名爲item的模型。每個項目屬於類別(另一個模型),其中有一個名爲name的屬性。Rails在URL中動態重命名模型名稱
在尋求任何項目,我看到/ URL作爲/項目:ID
相反,我想的URL顯示爲/'item.category.name'/:id
例如如果該商品屬於名稱爲「鞋類」的類別,那麼我希望將該網址看作/ footwear /:id。如果有另一個屬於「服裝」類別的商品,那麼我希望將URL看作/ clothing /:id
這可能嗎?
如果你喜歡安裝
# config/routes.rb
RouteTest::Application.routes.draw do
get ':category_name(/:id)', to: 'items#show', constraints: {id: /\d+/}
end
路線將映射到您的上述ItemsController演出行動,並在那裏,你將有機會獲得PARAMS [:CATEGORY_NAME],而params [:編號]。有了這些信息,您應該能夠獲得所需的數據並進行渲染。
請注意,此路線可能會掩蓋任何後續路線的不良影響。您可以使用rails高級路由約束來進一步縮小「哪些值將被視爲有效的category_names」,但這不會是一種可擴展或可管理的方法。
例如,你可以不喜歡
RouteTest::Application.routes.draw do
get ':brand_name(/:id)', to: 'items#show', constraints: lambda { |request| BrandList.include?(request.params[:brand_name]) }
# etc. ...
get ':category_name(/:id)', to: 'items#show'
end
但只有真正運作良好時BrandList是一個有限的列表,你可以在應用程序初始化時設定。
一個更好的,更具可擴展性的做法可能是與合適的人友好的URL前綴來設計你的URL像
/brand/adidas
/brand/teva
/shoes/1
/shoes/2
/jackets/45
督察,前綴知道像brand
命名空間和使用基於類的路由作爲一個包羅萬象的底部。
希望這會有所幫助。
太棒了。這就像一個魅力! – user2327691
一個問題 - 如果我添加了另一條路線,將會得到':brand_name /:id',如下所示:items#show如果brand_name和category_name具有共同的值(例如'nike'),哪個參數將傳遞給項目#show,params [:brand_name]或params [:category_name]? – user2327691
看起來它會匹配首先定義路線的路線。 – user2327691