浏览 4657 次
锁定老帖子 主题:Rails 3 下自定义错误信息显示页面
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-08
http://yangzhihuan.iteye.com/blog/577624
大家都知道想在Rails下自定义错误显示的页面是修改 rescue_action_in_public 这个方法,我之前也写过一篇blog介绍在Rails 2.X下如何自定义错误信息页面 不过在 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 ,我觉得这样做扩展更加干净。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-07-17
哥,自定义错误显示页面直接改改public/下对应的{status code}.html页面就好了。
Rails团队不至于怎么自定义错误页面也没提供接口给你吧。 |
|
返回顶楼 | |
发表时间:2010-07-17
人家是想处理错误时的时候做一些事情吧
楼上你给的这个,和楼主说的不是一个级别上的,http response code VS rails exceptions |
|
返回顶楼 | |
发表时间:2010-07-17
qichunren 正解。
|
|
返回顶楼 | |
发表时间: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不是好东西。 |
|
返回顶楼 | |
发表时间:2010-07-18
chenk85同学提出的这个用 middleware 去解决的办法不错啊,可以试一下。
主要是我对 middleware 知道的不多,所以我的办法很传统,middleware很前卫。 |
|
返回顶楼 | |
发表时间:2010-07-19
太有喜感了,楼上把Java的招聘广告发到Rails版来了。
|
|
返回顶楼 | |
发表时间:2010-07-22
难道rails3放弃了以前的rescue_from?我在项目中用这个比较多,不太喜欢大包大揽的rescue_action_in_public模板方法。
|
|
返回顶楼 | |
发表时间: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是错误的。 |
|
返回顶楼 | |