从原始渲染异常渲染500屏幕时避免双重渲染错误

时间:2013-01-31 21:21:29

标签: exception-handling ruby-on-rails-2

在我的应用程序控制器中,我有这个来捕获所有未被捕获的异常......

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

它很好地捕获异常并调用我的“render_500”操作,该操作将异常记录到数据库,然后呈现包含异常的引用GUID的自定义500页面(因此我可以稍后查找详细信息)。

我遇到的问题是,如果在渲染页面时发生异常(例如,视图中的错误代码,视图中引用的未定义变量),我最终会因为双重渲染而触发第二个异常错误。

关于如何在渲染500页时避免这种双重渲染错误的想法?

1 个答案:

答案 0 :(得分: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

加上你需要调整的其他标题。这没有测试,感觉有点不愉快,但我认为它应该工作。我很高兴听到是否有更清洁的方式。