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