Rails 3默认异常+ 404处理JSON请求

时间:2016-09-26 16:55:29

标签: json ruby-on-rails-3 exception-handling http-status-code-404

默认情况下,Rails会为404 Resource Not Found500 Internal Server Error提供有用的HTML页面。但是对于我的JSON API,我想提供JSON格式的回复。

如何为JSON请求设置默认的异常处理?

1 个答案:

答案 0 :(得分:0)

我为所有API控制器添加了一个基本控制器:

NOT_FOUND_EXC = [ActionController::RoutingError,
                 AbstractController::ActionNotFound,
                 ActiveRecord::RecordNotFound]

class BaseapiController < ActionController::Base
  respond_to :json
  rescue_from StandardError, with: :show_json_error

  def resource_not_found
    url = request.fullpath
    respond_with(url), status: :not_found)
  end

  private

  def show_json_errors(exc)
    case exc
      when *NOT_FOUND_EXC
        return resource_not_found
      else
        logger.error exc.message
        logger.error exc.backtrace.join("\n")
        respond_with(exc), status: :internal_server_error)
    end
  end
end

我已经在routes.rb中定义了这个:

namespace :api do
  ...
end
match 'api/*url', to: 'baseapi#resource_not_found'

现在rescue_from子句捕获所有异常,并通过#resource_not_found捕获不匹配的路由。

我认为这错过了一些关于Rails异常处理的基本原理,因为通常错误应该在开发中用表达细节来处理,并且只是在prod中呈现。我显然不是这样做的。 HTML异常仍然可以泄漏。所以反馈和备选方案很受欢迎,我是Rails的新手,希望我错过了一个可以接入的机制。