【问题标题】:Avoiding double render error when rendering a 500 screen from original render exception从原始渲染异常渲染 500 屏幕时避免双重渲染错误
【发布时间】:2013-01-31 21:21:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    通过第二次渲染来避免双重渲染错误的方法似乎是检查是否已经存在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
    

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

    【讨论】:

    • 谢谢!我会试一试,看看效果如何。
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2012-12-11
    • 2021-03-12
    • 2012-12-16
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多