2013-08-02 82 views
2

在Rails中,我有一個名爲item的模型。每個項目屬於類別(另一個模型),其中有一個名爲name的屬性。Rails在URL中動態重命名模型名稱

在尋求任何項目,我看到/ URL作爲/項目:ID

相反,我想的URL顯示爲/'item.category.name'/:id

例如如果該商品屬於名稱爲「鞋類」的類別,那麼我希望將該網址看作/ footwear /:id。如果有另一個屬於「服裝」類別的商品,那麼我希望將URL看作/ clothing /:id

這可能嗎?

回答

2

如果你喜歡安裝

# 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命名空間和使用基於類的路由作爲一個包羅萬象的底部。

希望這會有所幫助。

+0

太棒了。這就像一個魅力! – user2327691

+0

一個問題 - 如果我添加了另一條路線,將會得到':brand_name /:id',如下所示:items#show如果brand_name和category_name具有共同的值(例如'nike'),哪個參數將傳遞給項目#show,params [:brand_name]或params [:category_name]? – user2327691

+0

看起來它會匹配首先定義路線的路線。 – user2327691