2012-04-05 67 views
0

我建立一個Rails3中的應用,並在那一刻我在我的routes.rb文件中的以下行:如何在導軌3路線中省略兩個型號的控制器?

get "/:id" => 'tapes#show' 

換句話說,您可以使用website.com/tapes/1並且還通過using website.com/1 顯示磁帶 (我也使用friendly_id寶石,所以用戶實際上看到一個友好的URL中的website.com/tapename形式)

現在,我想實現的是做同樣的事情用戶頁。因此,我不想使用website.com/users/alex顯示用戶頁面,而是希望能夠使用website.com/alex

有沒有辦法在routes.rb 中實現這個'用戶'邏輯以及現有的'磁帶'規則,並以某種方式設置優先級? 因此,如果有人訪問website.com/alex我的應用程序會搜索是否有用戶記錄ID爲'alex',如果沒有找到,然後尋找磁帶 ID爲'亞歷克斯'。

我可以在路由中使用某種高級約束嗎? 任何想法?

非常感謝您的幫助,

亞歷

回答

1

Rails的就沒有辦法確定哪個控制器您試圖訪問。這將是唯一可行的辦法,就是如果任:

  1. 你能確定它會解析到基於該名稱的一些正則表達式哪種模式。 或

  2. 您知道用戶名和磁帶名稱從未發生衝突,並願意承擔敲擊數據庫以解決正確控制器的費用。

這可能是多種原因一個壞主意,它會影響性能,它也不會符合RESTful原則,它可能會引起混亂給用戶。

+0

感謝您的回覆idbentley。我想知道是否可以在** Tapes **控制器中實現邏輯,也就是說,只有在基於提供的id找不到@tape的情況下,才搜索此id是否對應於用戶,如果是,則相應地重定向。根據我的應用程序,假設磁帶將比用戶訪問得更加頻繁是安全的。那個if語句會顯着影響性能嗎? – Alex 2012-04-05 17:03:04

+0

此外,我想爲用戶提供輕鬆與公衆分享其個人資料的選項,因此從URL中刪除/ users/part是有意義的。與Tapes模型一樣。只是解釋我的推理.. – Alex 2012-04-05 17:08:43

+0

你當然可以做到這一點,是的。就像'if Tape.find_by_name tape_name'將會執行條件操作一樣,如果不存在這樣的'Tape',則使用'redirect_to'函數來傳遞它。但是,正如我上面所說,這會爲每個請求添加一個不必要的數據庫調用。性能影響可能不是什麼大問題。我仍然建議不要這樣做:'website.com/user/alex'就像'website.com/alex'一樣可讀,並且不需要任何hackery。最後,如果你選擇這樣做,一定要記錄它,因爲這將會讓未來的開發者感到困惑。 – idbentley 2012-04-05 18:10:17