2009-10-01 58 views
0

我想做的事:如果數據庫關閉,將用戶重定向到一個特殊的錯誤頁面。在Ruby on Rails中捕獲初始化錯誤

我正在使用Oracle數據庫和OCI適配器。

看來,如果數據庫不可用(比如說備份),在我打到控制器之前,OCI適配器會拋出一個錯誤(根據堆棧跟蹤,它是在設置連接池時) 。因此,即使在ApplicationController中,我也不能使用rescue_fromrescue_action - 救援線路從未到達。

有沒有什麼辦法可以「包裝」初始化或以其他方式挽救比ApplicationController更高級別(或更早的點)的特定錯誤?

回答

1

嘗試覆蓋ActionController::Failsafe,或者在堆棧之前插入另一箇中間件,那麼應該能夠捕獲幾乎所有的異常,並且可以隨意捕獲302個異常。

例子:

class DbFailsafe 
    def new(app) 
    @app = app 
    end 

    def call(env) 
    @app.call(env) 
    rescue DataBaseError => e 
    [302, {"Content-Type" => "text/plain", "Location" => "http://otherserver.com/sorrt-the-site-is-down.html"}, ["You are being redirected to http://otherserver.com/sorrt-the-site-is-down.html"]] 
    end 
end 

,並在您的environment.rb

config.middleware.insert_after ::ActionController::Failsafe, DbFailsafe 

我建議(因爲我們應該returing一個5XX不是3XX)呈現一個簡單的頁面與一個js重定向。這很簡單,只需編輯public/500.html即可。