`
wuhuizhong
  • 浏览: 686574 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

处理Rails错误

    博客分类:
  • ROR
阅读更多

Handling Rails 404 and 500 errors

I spent a couple of hours trying to figure out how to handle 404 and 500 errors in Rails. This is not simple and actually really annoying. Hopefully future versions clean this up because right now it sucks pretty badly. Anyways, I found a page on the wiki and some other blogs, but the issue was that they wouldn’t handle all the cases. So, here’s the solution:

1. Edit your app/controllers/application.rb file and add these three methods:

  def rescue_404
    rescue_action_in_public CustomNotFoundError.new
  end

  def rescue_action_in_public(exception)
    case exception
      when CustomNotFoundError, ::ActionController::UnknownAction then
        #render_with_layout "shared/error404", 404, "standard"
        render :template => "shared/error404", :layout => "standard", :status => "404"
      else
        @message = exception
        render :template => "shared/error", :layout => "standard", :status => "500"
    end
  end

  def local_request?
    return false
  end


The first method will be explained in the next step. The second method is the method that Rails calls to handle most errors. This method will not capture a certain class of errors where neither the controller nor the action requested exist. The third method tells rails to stop sucking. Normally Rails handles requests made to localhost or 127.0.0.1 differently than all others. This might be for debugging purposes, but it sucks when testing error handling.

2. Edit config/routes.rb and add this line TO THE END OF THE FILE:

  map.connect '*path', :controller => 'application', :action => 'rescue_404' unless ::ActionController::Base.consider_all_requests_local


This tells Rails that if it can’t find any other route to handle the request (i.e. the *path) it should call the rescue_404 action on the application controller (the first method above).

3. Edit config/environments/development.rb and add this line:

ActionController::Base.consider_all_requests_local = false


This additionally tells Rails to stop sucking and stop handling requests to localhost and 127.0.0.1 differently.

Anyways, happy coding.

 

map.connect “*anything”, :controller => “your_controller”, :action => “your_action”

params[:anything]



http://henrik.nyh.se/2008/07/rails-404

http://6brand.com/rails-custom-404-pages.html


Rails全局处理Error 

查看Rails源码 :actionpack/lib/action_controller/rescue.rb:


def rescue_action_in_public(exception) #:doc:
render_optional_error_file response_code_for_rescue(exception)
end

我们可以重写这个方法,application.rb中:
def rescue_action_in_public(exception)
case exception.class.name
when
'ActiveRecord::RecordNotFound','::ActionController::UnknownAction','::ActionController::RoutingError'
RAILS_DEFAULT_LOGGER.error("404 displayed")
render(:file => "#{RAILS_ROOT}/public/404.html", :status => "404 Error")
else
RAILS_DEFAULT_LOGGER.error("500 displayed")
render(:file => "#{RAILS_ROOT}/public/500.html", :status => "500 Error")
end
end

然后注意,这里rescue_action_in_public方法是只对production环境有用的,在developmen模式下不起作用
我们继续看源码:
def rescue_action(exception)
log_error(exception) if logger
erase_results if performed?

# Let the exception alter the response if it wants.
# For example, MethodNotAllowed sets the Allow header.
if exception.respond_to?(:handle_response!)
exception.handle_response!(response)
end

if consider_all_requests_local || local_request?
rescue_action_locally(exception)
else
rescue_action_in_public(exception)
end
end

注 意最后那个if语句,这里是判断request是否来自本地的请求,当为development下,被rescue_action_locally方法处 理exception,但是我们如果在application里重写rescue_action_locally方法,就可以自由的测试开发了。如下:

#for development
def rescue_action_locally(exception)
case exception.class.name
when 'ActiveRecord::RecordNotFound','::ActionController::UnknownAction','::ActionController::RoutingError'
RAILS_DEFAULT_LOGGER.error("404 displayed")
render(:file => "#{RAILS_ROOT}/public/404.html", :status => "404 Error")
else
RAILS_DEFAULT_LOGGER.error("500 displayed")
render(:file => "#{RAILS_ROOT}/public/500.html", :status => "500 Error")
end
end

 

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

我一般都会在lib目录下新建一个ooxx.rb文件存放下面的代码,然后在environment.rb下加载一下.

environment.rb

require  File .join( File .dirname(__FILE__), '..' 'lib' , 'ooxx' )  

require File.join(File.dirname(__FILE__),'..', 'lib','ooxx')


ooxx.rb
module ActionController
  module Rescue
    protected
    #自定义的错误处理
    def rescue_action_in_public(exception)
      logger.error("rescue_action_in_public executed")
      # 这里就是你可以折腾的地方
      case exception
      when ActiveRecord::RecordNotFound, ::ActionController::RoutingError,
        ::ActionController::UnknownAction
        logger.error("404 displayed")
        render(:file  => "#{RAILS_ROOT}/public/404.html",
               :status   => "404 Not Found")
      else
        logger.error("500 displayed")
        render(:file  => "#{RAILS_ROOT}/public/500.html",
               :status   => "500 Error")
        #      SystemNotifier.deliver_exception_notification(self, request,
        #                                                    exception)
      end
    end
  end
end



请注意做完以上操作后,在开发环境下,照样会跳转到错误跟踪页面的,这是因为这个方法是否起作用取决于development.rb和production.rb中的配置:
# in production.rb 
config.action_controller.consider_all_requests_local = false 
 
# in development.rb 
config.action_controller.consider_all_requests_local = true

分享到:
评论

相关推荐

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

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

    Ruby-SimpleForm轻松处理Rails表单

    Simple Form能够自动处理模型验证错误,将错误信息显示在相应的输入字段下方。无需额外的代码,就能实现良好的用户体验。 5. **自定义样式和布局** Simple Form允许开发者灵活地定制表单的外观。可以设置`:...

    rails api(文档)

    6. **错误处理**:Rails API鼓励返回标准的HTTP状态码和结构化的错误消息,以便客户端可以理解并适当地处理错误。 7. **JSON Schema**:通过使用JSON Schema,开发者可以定义API的数据结构和验证规则,增强API的可...

    rails 常见灵异错误汇总

    以下是一些常见的Rails错误及其解决方法。 1. **NoMethodError**:这是Rails中最常见的错误之一,通常表示尝试调用一个不存在的方法。检查代码中是否存在拼写错误或未定义的方法,确保引用的实例变量正确,并且在...

    使用Aptana+Rails开发Rails Web应用(中文)

    模型负责数据操作,视图用于展示用户界面,而控制器则作为两者之间的桥梁,处理用户请求并调用模型方法。在Aptana中,你可以直接在这些目录中编写相应的Ruby代码,IDE会提供代码补全和错误检查等功能。 例如,要在...

    railsAPI

    Rails提供了一些内建的错误处理机制,如 rescued exceptions 和 custom error classes。同时,模型中的validations可以帮助确保数据在被保存到数据库之前满足一定的条件。 测试是Rails开发流程的重要部分。Rails...

    rails-api-4.0.0

    可以通过rescue_from或自定义异常类来捕获和处理错误。 七、安全与认证: API的安全性至关重要。常见的安全策略包括OAuth2、JWT(JSON Web Tokens)或API密钥。Rails提供如devise_token_auth这样的库来协助实现这些...

    The Rails 4 Way

    - **Rack**:Rack是Ruby Web应用的一个接口规范,Rails基于Rack实现了自己的请求处理流程。 - **ActionDispatch**:ActionDispatch是Rails中处理HTTP请求的核心模块,负责解析请求并将请求分发到合适的控制器方法。 ...

    Rails 101S

    - **深入实践CRUD功能**:详细讲解如何具体实现CRUD操作,包括数据验证、错误处理等高级特性。 - **MVC架构与RESTful概念**:介绍模型(Model)、视图(View)、控制器(Controller)三者之间的关系以及RESTful API的设计...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    5. **错误处理**:定义一套统一的错误处理策略,当请求无法正确处理时能够向客户端返回清晰的错误信息。 6. **性能优化**:考虑使用缓存、异步处理等方式提高API的响应速度和并发能力。 ### 四、示例:创建一个简单...

    ruby on rails 开发环境包(ruby1.8.7,rails2.2.3)

    Ruby 1.8.7引入了块参数、内建的JSON支持以及改进的错误处理机制等,使得开发者能够更高效地编写代码。 Rails 2.2.3则是Rails框架的一个旧版本,发布于2009年。尽管现在有更先进的Rails版本,但在当时,Rails 2.2.3...

    rails 3.2 API

    在Rails 3.2中,ActionMailer改进了配置和错误处理,使得邮件发送更加稳定可靠。 4. **ActiveRecord**:这是Rails的ORM(对象关系映射)层,它允许开发者使用Ruby来操作数据库,而无需编写SQL。Rails 3.2的...

    Ajax on Rails

    例如,当一个链接或表单标记为`remote: true`时,Rails会默认使用Ajax处理请求。此外,`data-*`属性用于传递额外的信息,如HTTP方法(GET或POST)和回调函数。 **jQuery与Rails的结合** 在Rails早期版本中,经常...

    weixin_rails_middleware, 微信集成 ruby weixin_rails_middleware for integration weixin..zip

    `weixin_rails_middleware` 是基于 Ruby 的 Rack 技术构建的,它能够插入到 Rails 应用的请求处理流程中。当收到微信服务器发来的请求时,中间件会自动处理这些请求,如验证签名、解析XML数据,并提供相应的响应。 ...

    rails 部署 nginx

    文件 "nginxx_template.conf" 可能是一个自定义的Nginx配置模板,用于指定如何处理Rails应用的请求。配置中可能包含以下部分: - `server` 块定义了一个监听特定端口的服务器实例。 - `location` 块指定了Nginx...

    rails上传文件_paperclip

    在Ruby on Rails框架中,Paperclip是一个非常流行的用于处理文件上传的库。它提供了一种简单而优雅的方式来管理和处理模型中的附件,如图片、文档等。Paperclip与ActiveRecord紧密集成,使得在Rails应用中添加文件...

    rails cookbook

    10. **错误和调试**:如何追踪和修复常见的Rails问题。 通过这本书,读者不仅可以学习到Rails的使用方法,还能了解到良好的开发实践和技巧,提升自己的Rails开发技能。同时,博客链接提供的额外资源可作为补充学习...

    Ruby-karafka基于ApacheKafka的Ruby和Rails应用程序开发框架

    2. **与Rails集成**:Ruby-Karafka很好地与Rails生态系统兼容,允许开发者利用已有的Rails应用基础设施,如配置、日志和错误处理。 3. **自动消费者组管理**:框架自动处理Kafka的消费者组管理,确保消息的正确分发...

    Ruby on Rails 指南 v5.0.1 中文版

    - **处理验证错误**:展示如何处理验证失败的情况,并返回适当的错误信息。 - **在视图中显示验证错误**:教授如何在前端视图中优雅地显示验证错误。 #### ActiveRecord回调 - **对象的生命周期**:解释...

Global site tag (gtag.js) - Google Analytics