`
yangzhihuan
  • 浏览: 168641 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
大家都知道想在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 ,我觉得这样做扩展更加干净。
分享到:
评论
9 楼 sunsonavaj 2012-03-22  
 
8 楼 chenk85 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是错误的。
7 楼 笨笨狗 2010-07-22  
难道rails3放弃了以前的rescue_from?我在项目中用这个比较多,不太喜欢大包大揽的rescue_action_in_public模板方法。
6 楼 yangzhihuan 2010-07-19  
太有喜感了,楼上把Java的招聘广告发到Rails版来了。
5 楼 yangzhihuan 2010-07-18  
chenk85同学提出的这个用 middleware 去解决的办法不错啊,可以试一下。

主要是我对 middleware 知道的不多,所以我的办法很传统,middleware很前卫。
4 楼 chenk85 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不是好东西。
3 楼 yangzhihuan 2010-07-17  
qichunren 正解。
2 楼 qichunren 2010-07-17  
人家是想处理错误时的时候做一些事情吧

楼上你给的这个,和楼主说的不是一个级别上的,http response code VS rails exceptions
1 楼 chenk85 2010-07-17  
哥,自定义错误显示页面直接改改public/下对应的{status code}.html页面就好了。

Rails团队不至于怎么自定义错误页面也没提供接口给你吧。

相关推荐

    ruby on rails 3

    Ruby on Rails 3 是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,极大地简化了Web开发过程。这个版本是在Ruby 1.9.2环境下发布的,带来了许多改进和新特性,旨在提高...

    :bomb:自定义错误页面:bomb:Ruby on Rails→将Ruby / Rails异常转换为品牌4xx / 5xx HTTP错误页面。-Ruby开发

    下载次数超过290,000,这是为Rails 5和6提供自定义400/500异常页面的“唯一”宝石,ExceptionHandler目前是CUSTOM Rails错误页面的最受欢迎的异常宝石。 拥有290,000多个下载量,这是为Rails 5和6提供自定义400/500...

    exception_handler::bomb:自定义错误页面:bomb:Ruby on Rails→将RubyRails异常转换为品牌的4xx5xx HTTP错误页面

    ExceptionHandler用动态视图替换Rails的默认错误页面。 它通过向控制器注入实现此目的-允许我们使用自己HTML填充错误的响应。 要了解其工作原理,您需要了解Rails如何处理错误: Rails使用 (上面)来生成错误响应...

    ubuntu下安装ruby on rails

    **问题描述:** 访问自定义页面时出现 `no such file load – sqlite3` 错误。 **解决方案:** Rails 默认使用 SQLite3 作为开发数据库。确保安装了 SQLite3: ```bash sudo apt-get install sqlite3 sudo gem ...

    The Rails 4 Way

    - 同时,它还提供了一些安全性的增强措施,如限制错误信息的显示等。 6. **日志记录** - 日志记录是调试和监控Rails应用程序的关键组件。 - Rails提供了丰富的日志记录功能,包括控制台输出、文件记录等。 - ...

    gaffe::collision:Gaffe以干净,简单的方式处理Rails错误页面

    Gaffe使在Rails应用程序中自定义错误页面变得容易。 它利用了Rails 3.2(显然是4.0+)中存在的一项功能,即exceptions_app 。 它带有默认错误页面,但是可以很容易地覆盖它们(您应该这样做)。 默认错误页面如下所...

    Rails Recipes Final.pdf

    - **编写态度**:作者在准备本书时采取了严谨的态度,但在使用本书包含的信息(包括程序列表)时,出版社不对任何错误、遗漏或可能由此产生的损害承担责任。 - **目标读者**:本书面向希望利用Rails框架进行高效软件...

    强大功能:为Rails应用动态呈现错误页面或JSON响应的简单而安全的方法

    您可以完全控制要显示特定异常的错误页面。 它还可以json呈现(对于API应用程序而言是完美的)。 它甚至提供了一种创建自定义例外应用程序的方法。 易于安装和开发 您不必配置每个人必须要做的事情,Rambulance可以...

    Rails Cache

    在使用缓存时,需要注意数据一致性问题,避免缓存中的过时数据导致用户看到错误信息。此外,敏感数据应加密存储,防止缓存被窃取。 10. **实际应用示例** 例如,在处理商品列表时,可以对热门商品的列表进行缓存...

    Rails & Twitter Bootstrap

    - **警告和提示(Alerts & Toasts)**:用于向用户显示信息、警告或错误消息,这些元素通常包含关闭按钮,以便用户可以轻松隐藏它们。 - **模态框(Modals)**:模态框是一种不离开当前页面就能展示额外信息或进行交互...

    rails登陆画面(原)

    在这个场景中,讨论的重点可能是关于如何创建、自定义或优化Rails应用的用户登录系统。 描述中提到解压后得到的是一个`rails.exe`文件,这可能是一个已经编译好的Rails应用可执行文件,或者是一个Rails开发环境的...

    对优化Ruby on Rails性能的一些办法的探究

    1. **错误地选择了Rails作为解决方案**:在某些情况下,Rails可能不是最佳选择。例如,当面对大规模数据分析或高性能计算需求时,其他专门的技术或语言(如Python、R等)可能是更好的选择。 2. **内存管理不当**:...

    RailsGuides blog示例网站 手打+纠错

    RailsGuides是一个专门为Ruby on Rails框架提供官方指南和教程的平台,它涵盖了从基础到高级的各种主题,帮助开发者深入理解并有效地使用Rails进行Web开发。这个"RailsGuides blog示例网站"是基于这些官方指南创建的...

    rails实现验证码实例

    5. **视图展示**:在Rails视图中,通过控制器提供的方法将验证码图像渲染到页面上。例如,创建一个名为`captcha`的助手方法,返回验证码的图像标签。 6. **表单验证**:在用户提交表单时,检查输入的验证码是否与...

    rails 文件上传

    在Ruby on Rails框架中,文件上传是一个常见的需求,特别是在构建Web应用时,用户可能需要上传图片、文档等。Rails提供了一种优雅的方式来处理文件上传,包括存储管理、处理和验证。这篇博文“rails 文件上传”可能...

    自定义控制器

    - 自定义控制器还可以包含异常处理逻辑,当业务逻辑中抛出异常时,可以捕获并返回合适的错误页面或JSON响应。 7. **拦截器和过滤器**: - 在某些框架中,可以使用拦截器或过滤器来在控制器方法调用前后执行额外的...

    Node.js-一个基于Koa2构建的类似于Rails的nodejs开源项目

    4. **错误处理**:内置或自定义错误处理中间件,确保在发生异常时优雅地处理错误。 5. **依赖注入**:借鉴Rails,可能会实现类似的服务定位器或依赖注入,方便管理应用程序的组件。 6. **数据库集成**:通常会与...

Global site tag (gtag.js) - Google Analytics