2

我有以下全局 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

4

1 回答 1

1

这是因为 jQuery 将 404 处理为错误:https ://github.com/jquery/jquery/blob/master/src/ajax.js#L613

在示例中,您提供的服务器在应用程序控制器中捕获 ActiveRecord::RecordNotFound 异常并返回#not_found 的结果。作为响应,jQuery 检测到 404 并引发 ajaxError 事件。

希望这可以帮助。

于 2013-02-12T22:48:48.193 回答