2010-11-04 97 views
3

爲了澄清,這裏的情況:Rails靜態頁面路由 - 有沒有更好的方法?

我構建了一個非常簡單的CMS,將成爲我計劃在未來創建的幾個應用程序的基礎。我真的很希望能夠創建一個名爲「About」(大部分是靜態的)的頁面,並自動地以「/ about」的方式訪問它,而不必修改routes.rb。

我現在有這樣一個通配符路線,工作得很好:

match '/*slug', :to => 'pages#dynamic_page', 
       :constraints => { :fullpath => /.+\.html/ } 

的問題是,我真的希望能夠省略名「.html」結尾。但是,我更喜歡通過諸如「/ pages/about」之類的網址進行擴展。有沒有更好的方法來處理這個問題?我刪除約束時發生的問題是,對不存在的項目的請求會通過Rails路由器,這顯然不太理想,因爲這是需要處理的額外開銷。

有沒有更好的方法?如果被請求的頁面是一個靜態頁面,有沒有辦法完全避免路由器,所以我可以消除通配符路由?

謝謝!

回答

2

要在Rails的路由器解決這個問題,土特產品應該能夠只是一個路由添加到routes.rb中的最底端,看起來是這樣的:

match '/:slug(.:format)', :to => 'pages#dynamic_page' 

括號標記:格式參數路由是可選的,所以/ about或/about.html應該工作。

這需要位於路由文件的底部,以便它不會干擾您的其他路由。

如果你想避免Rails路由器,你有兩個選擇,兩個更高級一點。

  1. 在您的Web服務器的配置中,添加一個重寫規則,該規則映射/關於某個其他URI。

  2. 添加Rack中間件或Rails金屬來處理您的靜態頁面路由。這樣可以避免通過整個Rails路由堆棧運行這些請求,但Rails 3路由器速度非常快,我不確定爲了提供半靜態頁面而添加這麼多的複雜性是值得的。

您可能還想看看High Voltage gem。這是一個主要用於靜態頁面的Rails引擎。默認情況下,它給你一個/頁/關於風格的URL,但你可以添加以下到您的路線,使其更漂亮:

# High Voltage treats pages like a REST resource; the page's name is the ID 
match '/:id(.:format)', :to => 'high_voltage/pages#show' 
+0

謝謝 - 與具有格式可選,但問題是,瀏覽器則開始向/favicon.ico發出請求,並且這些請求會通過我的PagesController中的dynamic_page方法。所述方法中發生的第一件事是數據庫命中,看看是否有任何匹配的網頁帶有'favicon'或'favicon.ico'的url slug - 我真的想避免命中數據庫。這就是爲什麼我現在有那裏的.html約束。 – codykrieger 2010-11-04 21:39:36

+1

你有一個靜態的favicon.ico文件嗎?不幸的是,瀏覽器需要一個,我不想構建一個瘋狂的複雜解決方案,只是爲了解決這個問題,所以我只是在我的公共目錄中放置一個空白的favicon文件並將其稱爲完成。你甚至可以把它變成一個空的文本文件 - 瀏覽器會窒息它,但它也會扼殺你的應用程序中的500錯誤,這樣就沒有數據庫命中。 – 2010-11-04 22:12:44

+0

我不這樣做,但我想如果需要的話我可以。我主要關心的是,每次出現404或路由錯誤時,它都會不必要地通過該路由。 – codykrieger 2010-11-05 01:16:33

相關問題