我有以下全局 ajax 错误处理程序:
App.Utils.AjaxGlobalErrorHandler = {
isUnauthenticatedStatus: function (request) {
var status = request.status
return status == 403;
},
displayError: function() {
$('#ajax-error-modal-window').modal('show');
$('#ajax-error-message').append("An error occurred. Please, try again.");
},
errorMsgCleanup: function() {
$('#ajax-error-modal-window').on('hidden', function() {
$('#ajax-error-message').empty();
});
},
handleUnauthorized: function() {
if ($('#signin').length == 0) {
window.location = '/signin';
}
else {
$('#signin').trigger('click');
}
},
bindEvents: function() {
$(document).ajaxError(function(e, xhr, settings, exception) {
if (App.Utils.AjaxGlobalErrorHandler.isUnauthenticatedStatus(xhr)) {
App.Utils.AjaxGlobalErrorHandler.handleUnauthorized();
}
else {
App.Utils.AjaxGlobalErrorHandler.displayError();
App.Utils.AjaxGlobalErrorHandler.errorMsgCleanup();
}
});
}
};
然后是您的标准 Rails 全局异常处理:
class ApplicationController < ActionController::Base
rescue_from Exception, :with => :handle_exceptions
protected
def handle_exceptions(e)
case e
when AbstractController::ActionNotFound, ActiveRecord::RecordNotFound, ActionController::RoutingError
not_found
else
internal_error(e)
end
end
def not_found
render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404
end
def internal_error(exception)
if Rails.env == 'production'
ExceptionNotifier::Notifier.exception_notification(request.env, exception).deliver
render :file => "#{Rails.root}/public/500.html", :layout => false, :status => 500
else
throw exception
end
end
end
如您所见,我的 ajax 错误处理显示了一个对话框。我遇到的问题是,当我通过引发ActiveRecord::RecordNotFound
返回 html 响应的控制器操作中的异常来测试错误处理时,在 Rails 呈现 404 页面之前触发 ajaxError 事件,对话框是显示,然后在呈现 404 页面后消失。我没想到在这种情况下会触发 ajaxError 事件。有人可以解释为什么吗?当异常应该由服务器端处理时,如何避免触发 ajaxError? 顺便说一句,我正在使用 pjax。