1

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

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

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

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

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

4

1 回答 1

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

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

于 2013-03-05T13:39:00.513 回答