[英]Rails and ajax global error handling issue
我有以下全局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错误处理显示一个对话框。 我遇到的问题是,当我通过在返回HTML响应的控制器操作中引发ActiveRecord::RecordNotFound
异常来测试错误处理时,会在Rails渲染404页面之前触发ajaxError事件,显示该对话框,然后在呈现404页面后消失。 我没想到在这种情况下会触发ajaxError事件。 有人可以解释为什么吗? 并且如何避免异常应由服务器端处理时触发ajaxError? 顺便说一下 , 我正在使用pjax 。
这是因为jQuery将404处理为错误: https : //github.com/jquery/jquery/blob/master/src/ajax.js#L613
在该示例中,您要让服务器在应用程序控制器中捕获ActiveRecord :: RecordNotFound异常,并返回#not_found的结果。 作为响应,jQuery检测到404并引发ajaxError事件。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.