论坛首页 编程语言技术论坛

Rails 3 下自定义错误信息显示页面

浏览 4618 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-08  
大家都知道想在Rails下自定义错误显示的页面是修改 rescue_action_in_public 这个方法,我之前也写过一篇blog介绍在Rails 2.X下如何自定义错误信息页面 http://yangzhihuan.iteye.com/blog/577624

不过在 Rails 3中这个方法的位置改变了,上文提到的链接中的方法已经无效了,其它还是修改  rescue_action_in_public 这个方法,只不过这个方法不再放在 ActionController::Rescue 这个module里面了,请看代码:
#以下的代码放在 config/initializers 文件夹下,随便弄个文件名都可以,放在这个文件夹下,启动项目时会自动加载,这样就不用像放在 lib 文件夹中,还要手工去加载了。
module ActionDispatch
  class ShowExceptions

    private
    # customize error handle
    def rescue_action_in_public_with_handle_system_error(exception)
      logger.error("rescue_action_in_public executed")
      begin
       # 修改这个文件的主要目的就是为了加上这么一句
        SystemErrorNotify.system_error(exception).deliver
      rescue => e
        logger.error "****************************"
        logger.error "#{e.message}"
        logger.error "#{e.backtrace.join('\n')}"
        logger.error "****************************"
      end

      # 调用原来的 rescue_action_in_public 方法,该干嘛干嘛去
      rescue_action_in_public_without_handle_system_error(exception)
    end
    alias_method_chain :rescue_action_in_public,:handle_system_error
  end
end

#注意 rescue_action_in_public 现在放在 ActionDispatch::ShowExceptions 中

# 我也不再直接覆盖 rescue_action_in_public 方法,而是使用了 alias_method_chain ,我觉得这样做扩展更加干净。
   发表时间:2010-07-17  
哥,自定义错误显示页面直接改改public/下对应的{status code}.html页面就好了。

Rails团队不至于怎么自定义错误页面也没提供接口给你吧。
0 请登录后投票
   发表时间:2010-07-17  
人家是想处理错误时的时候做一些事情吧

楼上你给的这个,和楼主说的不是一个级别上的,http response code VS rails exceptions
0 请登录后投票
   发表时间:2010-07-17  
qichunren 正解。
0 请登录后投票
   发表时间:2010-07-18  
qichunren 写道
人家是想处理错误时的时候做一些事情吧

楼上你给的这个,和楼主说的不是一个级别上的,http response code VS rails exceptions


Rails的Exception最终还是映射到status code上,这部分是交给了Rack来映射的。

def status_code(exception)
  Rack::Utils.status_code(@@rescue_responses[exception.class.name])
end


LZ的目的是:
引用

2010-01-22
rails下自定义出错页面
文章分类:Ruby编程
rails出错的时候,一般都是跳转到错误跟踪的页面下,这样在开发环境下是很好的,但是对正式环境就不是太友好了,所以如果你想自定义一下出错的页面, 还是有办法的.


如果要想在遇到某些错误的时候自己再做什么东西的话大可以用middleware:

class CustomizeExceptionHandler
  def initialize(app, options = {})
    @app = app
  end

  def call(env)
    @app.call(env)
  rescue ExceptionWantToHandle => exception
    // do anything you want
    raise exception // raise if you want rails continue to handle this exception
  end
end


当你开始monkey patch之前应该想想能不能不用monkey patch去解决,monkey patch不是好东西。
0 请登录后投票
   发表时间:2010-07-18  
chenk85同学提出的这个用 middleware 去解决的办法不错啊,可以试一下。

主要是我对 middleware 知道的不多,所以我的办法很传统,middleware很前卫。
0 请登录后投票
   发表时间:2010-07-19  
太有喜感了,楼上把Java的招聘广告发到Rails版来了。
0 请登录后投票
   发表时间:2010-07-22  
难道rails3放弃了以前的rescue_from?我在项目中用这个比较多,不太喜欢大包大揽的rescue_action_in_public模板方法。
0 请登录后投票
   发表时间:2010-07-23  
笨笨狗 写道
难道rails3放弃了以前的rescue_from?我在项目中用这个比较多,不太喜欢大包大揽的rescue_action_in_public模板方法。


没有丢掉rescue_from这方法,不过这个方法的实现已经移到ActiveSupport了:

http://github.com/rails/rails/blob/master/activesupport/lib/active_support/rescuable.rb

ActionController里只是简单地包装了一下这个方法:

http://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/rescue.rb

Rails的代码中还有个叫Rescue的Middleware,不知道是之前用了现在不用或者是还没用上:

http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/rescue.rb

如果不使用rescue_from的话,异常会交由ShowException这个Middleware去处理(渲染错误页面):

http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/show_exceptions.rb

像Rails团队自己做的exception_notification(http://github.com/rails/exception_notification)也是利用Middleware的方法去获得异常然后进行通知,而不是用rescue_from。

楼主的做法纯粹是误导。Rails已经提供几个地方可以无侵入式的自定异常处理,而楼主这种强行进行method override是错误的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics