Rails中遇到错误跳转到统一提示错误页的方法
一个迭代开发中的网站难免存在bug,出bug的时候客户体验就很不好了,为解决此问题,可以在classerror产生的时候,触发跳转到统一提示页面,并给开发人员发邮件报错误信息,提高测试能力和用户体验。以下是核心方法;在ApplicationController中添加如下代码,不同rails版本的classerror略有变化。
AR_ERROR_CLASSES=[ActiveRecord::RecordNotFound,ActiveRecord::StatementInvalid] ERROR_CLASSES=[NameError,NoMethodError,RuntimeError, ActionView::TemplateError, ActiveRecord::StaleObjectError,ActionController::RoutingError, ActionController::UnknownController,AbstractController::ActionNotFound, ActionController::MethodNotAllowed,ActionController::InvalidAuthenticityToken] ACCESS_DENIED_CLASSES=[CanCan::AccessDenied] ifRails.env.production? rescue_from*AR_ERROR_CLASSES,:with=>:render_ar_error rescue_from*ERROR_CLASSES,:with=>:render_error rescue_from*ACCESS_DENIED_CLASSES,:with=>:render_access_denied end #calledbylastroutematchingunmatchedroutes. RaisesRoutingErrorwhichwillberescuedfrominthesamewayasotherexceptions. #备注rails3.1后ActionController::RoutingError在routes.rb中最后加如下代码才能catch了。 #rails3下:match'*unmatched_route',:to=>'application#raise_not_found!' #rails4下:get'*unmatched_route',:to=>'application#raise_not_found!' defraise_not_found! raiseActionController::RoutingError.new("Noroutematches#{params[:unmatched_route]}") end defrender_ar_error(exception) caseexception when*AR_ERROR_CLASSESthenexception_class=exception.class.to_s elseexception_class='Exception' end send_error_email(exception,exception_class) end defrender_error(exception) caseexception when*ERROR_CLASSESthenexception_class=exception.class.to_s elseexception_class='Exception' end send_error_email(exception,exception_class) end defrender_access_denied(exception) caseexception when*ACCESS_DENIED_CLASSESthenexception_class=exception.class.to_s elseexception_class="Exception" end send_error_email(exception,exception_class) end