2013-01-31 29 views
1

在我的應用程序控制器,我有這樣的捕獲所有否則捕獲的異常......避免雙重渲染錯誤從原來的呈現500的屏幕渲染時異常

if Rails.env != "test" 
    rescue_from Exception, :with => :render_500 
end 

它很好地捕獲異常,並要求我「render_500」 action,它將異常記錄到數據庫中,然後呈現包含異常的引用GUID的自定義500頁面(以便稍後查找詳細信息)。

我遇到的問題是,如果在呈現頁面時發生異常(例如,視圖中的代碼錯誤,視圖中引用了未定義的變量),我最終會因爲雙重觸發第二個異常呈現錯誤。

有關如何避免這種情況的雙重渲染渲染500頁錯誤的想法?

回答

2

通過渲染第二時間,以避免雙重渲染錯誤的方式似乎是檢查是否已經有一個response body ...

render unless response_body 

,因爲如果我理解正確的話,你希望第二個渲染替換第一個,你可以嘗試用你自己的替換現有的response_body。由於response_body是一個字符串數組你很可能render_to_string然後更換響應體,如:你需要調整

def render_500 
    ...stuff... 
    response = render_to_string "myController/view" 
    status = 500 
    unless response_body 
    render :inline=> response 
    else 
    response_body = [response] 
    end 
end 

加任何其他頭。這沒有測試,感覺有點不愉快,但我認爲它應該工作。我很樂意聽到有沒有更清晰的方法。

+0

謝謝!我會試試看看它是如何發展的。 –