2009-09-19 96 views
25

我一直在尋找一個簡單的答案,這個很可笑的時間很長,看起來像這樣必須是如此明顯而簡單,因爲沒有人有一個簡單,傻瓜證明教程。基本導軌404錯誤頁面

無論如何,我想要做的只是一個單一的404.html靜態頁面,加載任何錯誤時拋出。理想情況下,這應該只在生產和舞臺上發生。

我覺得這應該是最簡單的事情......但我無法弄清楚。

任何幫助,非常感謝。

+0

問得好@chishomer,我給出最好的答案。檢查一下。 http://stackoverflow.com/questions/1447627/basic-rails-404-error-page/8987083#answer-8987083 –

回答

19

ApplicationController

unless ActionController::Base.consider_all_requests_local 
    rescue_from Exception, :with => :render_404 
end 

private 

    def render_404 
    render :template => 'error_pages/404', :layout => false, :status => :not_found 
    end 

現在設立error_pages/404.html和你去那裏

...也許我縮手縮腳與異常,你應該從RuntimeError搶救代替。

+1

感謝您的答案,我也想補充說,有一個深入的寫作,我發現這個話題 http://www.perfectline.co.uk/blog/custom-dynamic-error-pages-in-ruby-on-rails – Schneems

+0

它似乎不適用於Rails 3 – hoyhoy

+2

它應該工作,雖然文檔說你應該使用'Rails.application.config.consider_all_requests_local'而不是'ActionController :: Base.consider_all_requests_local'。 –

14

我相信,如果您在生產模式下運行,那麼每當沒有URL的路由時,公共目錄中的404.html將被獲取。

2

每當發生任何錯誤時都不會得到404,因爲並非所有錯誤都會導致404錯誤。這就是爲什麼你的公共目錄中有404,422和500頁。我想鐵軌已經認爲這是最常見的錯誤。像Ben說的那樣,404會在找不到東西時出現,500當應用程序拋出錯誤時。在這兩者之間,你可以覆蓋很多你的基地。

7

如果您在生產模式下運行,每當發生相應錯誤時,公共目錄中的404.html,500.html,422.html文件都會得到處理,則會顯示上面的頁面。

在Rails 3.1

我們可以使用如下: 的Rails 3.1將自動生成正確的HTTP狀態碼的響應(在大多數情況下,這是200 OK)。您可以使用:狀態選項更改此:

渲染:狀態=> 500

渲染:狀態=>:禁止

Rails understands both numeric and symbolic status codes.

Fore more information see this page

乾杯!

0

這樣做的另一種方式是用下面的配置您的config/application.rb

module YourApp 
    class Application < Rails::Application 
    # ... 

    config.action_dispatch.rescue_responses.merge!(
     'MyCustomException' => :not_found 
    ) 
    end 
end 

所以,每當MyCustomException升高,Rails的把它當作一個普通:not_found,渲染public/404.html

要在本地測試,確保你改變config/environments/development.rb到:

config.consider_all_requests_local = false 

瞭解更多關於config.action_dispatch.rescue_responses.