2012-07-31 51 views
2

我正在尋找一些關於使用頂級路由的哲學和技術實踐方面的一些反饋,這在Rails中並不是全部。Rails路由頂級路由和信息體系結構

例子:

# routes.rb 
get '/cities' => 'cities#index' 
get '/:city_id' => 'cities#show', as: :city, city_id:/([a-z\-\d]+)/ 

我有30K左右的城市是:city_id應僅限於匹配的東西,如「/洛杉磯 - 洛杉磯」,而不是「/somewrongthing.jpg」。由於這是最後一條路線,它已成爲一個全面的。如果找不到城市,我目前正在渲染一個404,但這意味着每次缺少鏈接時都會觸發數據庫。我通過限制來限制它,但它並不是我希望的優雅解決方案。

除了將它放在/ city /:city_id之外,還有其他解決方案嗎?

+0

是不是/ city /:city_id的標準方法?有沒有你不想使用它的原因? – Tyrsius 2012-07-31 21:18:36

+0

是的,我想有一個非標準的用例。只是評估我的選擇。 – Glenn 2012-07-31 22:21:12

回答

3

我認爲你應該尋找一些替代方案來處理路線本身。 30,000條路線只會交易數據庫問題的RAM問題。 也許你有一些普通的ruby對象(文件支持,也許是?),它可以充當城市緩存,並且可以在每次請求中查詢到你的城市路線。

這樣的事情,也許呢?

# in config/routes.rb 
get '/:city' => 'cities#show', constraints: CityConstraint.new 

# in lib/city_constraint.rb 
class CityConstraint 
    def matches?(request) 
    city_valid?(request.params[:city]) 
    end 

    private 

    def city_valid?(city) 
    # I dunno.. Redis, look it up in a text file, hash, etc. 
    # ..look it up in activerecord and cache it at startup? 
    # or whatever... 
    end 
end 
+0

乾燥的解決方案。謝謝@Matt。十分優雅。我想,當真正優化這個時候,我有一些選擇。因爲每個城市「紐約 - 紐約」都附加了狀態,所以我試圖想到一個匹配城市結束的正則表達式約束。感謝您的意見。 – Glenn 2012-07-31 22:24:26

+0

走這條路線的另一個好處是,約束邏輯全部包裝在一個簡單的可測試類中。 – 2012-08-01 22:01:47