我們可以在生成類錯誤時觸發跳轉到統一的提示頁,并向開發人員發送電子郵件來報告錯誤信息,從而提高測試能力和用戶體驗,今天武林技術頻道小編找到了解決方法,下面一起來看看吧!
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]?
?
? if
Rails.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?
???
? #called by last route matching unmatched routes.? Raises RoutingError which will be rescued from in the same way as other exceptions.?
?
#備注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!'?
?
? def raise_not_found!?
??? raise ActionController::RoutingError.new("No route matches #{params[:unmatched_route]}")?
? end?
?
? def render_ar_error(exception)?
??? case exception?
??? when *AR_ERROR_CLASSES then exception_class = exception.class.to_s?
??? else exception_class = 'Exception'?
??? end?
?
??? send_error_email(exception, exception_class)?
? end?
?
? def render_error(exception)?
??? case exception?
??? when *ERROR_CLASSES then exception_class = exception.class.to_s?
??? else exception_class = 'Exception'?
??? end?
?
??? send_error_email(exception, exception_class)?
? end?
?
? def render_access_denied(exception)?
??? case exception?
??? when *ACCESS_DENIED_CLASSES then exception_class = exception.class.to_s?
??? else exception_class = "Exception"?
??? end?
?
??? send_error_email(exception, exception_class)?
? end