默认情况下,Rails会为404 Resource Not Found
和500 Internal Server Error
提供有用的HTML页面。但是对于我的JSON API,我想提供JSON格式的回复。
如何为JSON请求设置默认的异常处理?
答案 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的新手,希望我错过了一个可以接入的机制。