繁体   English   中英

Rails和Ajax全局错误处理问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM