`
yangzhihuan
  • 浏览: 165383 次
  • 性别: 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团队不至于怎么自定义错误页面也没提供接口给你吧。

相关推荐

    :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使用 (上面)来生成错误响应...

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

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

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

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

    报告员:一个Rails Engine,可在您的应用程序上提供可自定义的状态页面

    报告员(rap-or-TUHR) 该gem为您的应用程序提供了一个单独的状态检查端点。... ...{ " revision " : " ... 当应用程序验证失败时,将返回HTTP 500响应以及错误消息的集合,类似于用于模型验证的Rails <4.2响应器:

    draft-demo:draft.js开发的编辑器demos,包含自定义样式、自定义组件、entity、decorator等功能的示例

    您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less等) 添加图像...

    note-app-frontend

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    todo-app-react

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    yyd-react-cli

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    ProductivityTracker

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    doorman-ui:Rails GraphQL API中基于cookie的身份验证的前端

    您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less...

    resume_project-react:使用React组件恢复页面

    您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less...

    rl-js-react-demo:rl-js React应用的自定义部署演示

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    my-profile-site:使用wired.js的个人资料页面

    您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less...

    my-weather-app:显示和存储天气信息

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    business_page:这是我为本地企业主设计的页面。 它是在React中为实践而构建的,并且还展示了我对SASS的了解

    您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less...

    EditPlus 3.31 Build 1129

    * “工具”对话框会显示错误的浏览器名称列表 * 查找上一个时, “继续到下一个”选项不能工作 * 自定义文件类型无法设置缩进值为 1 * “在文件中查找”击键记录可能不正确 * 修正全屏模式下输出窗口位置错误的问题 *...

    React:github页面

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    myReact:前端页面

    您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less...

Global site tag (gtag.js) - Google Analytics