【问题标题】:Rails: what's providing my API with default exception-handling?Rails:是什么为我的 API 提供了默认的异常处理?
【发布时间】:2018-07-06 18:21:15
【问题描述】:

我正在开发 Rails 5 JSON API,我注意到它提供了开箱即用的合理异常处理。

例如,ActiveRecord::RecordNotFound 产生 404,ActionController::ParameterMissing 产生 400,这些都作为格式正确的 JSON 响应返回。

我在 rescue_from 上找到了大量文档,找不到为我提供这种异常处理的内容。

我在 Rails 指南、文档以及 Rails 控制台中进行了研究,例如

ActionController::API.new.rescue_handlers
=> []

ApplicationController.new.rescue_handlers
=> []

我想知道异常处理的来源,因为我注意到它被优雅地应用于实际请求,但不在控制器规范中。

例如,如果我运行本地服务器并向其发送带有curl 的格式错误的请求,我会得到一个合理的错误响应。但如果我尝试在控制器规范中重现它,

it "returns 404 if Yogurt doesn't exist" do
  put :update, params: { id: 293459 }
end

测试抛出原始异常(在本例中为ActiveRecord::RecordNotFound)。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    当您使用--api 选项设置Rails 5 应用程序时,您最终会使用ActionController::APIhttps://github.com/rails/rails/blob/master/actionpack/lib/action_controller/api.rb

    模块在此处构建:https://github.com/rails/rails/blob/a0061d2389a178b093f0d3f64f58236ffbe088e0/actionpack/lib/action_controller/api.rb#L104,因此您的回复最终来自这里。看起来渲染正在某个时候被移交给metal

    API 操作默认配置为返回 :json,因此您的测试与浏览器的行为方式不同。

    要使您的规范以相同的方式工作,您必须提供一种格式: put :update, params: { id: 293459 }, format: :json

    【讨论】:

    • 添加, format: :json 并没有改变规范行为,不幸的是。我也查看了metal,但仍然没有找到魔法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2018-11-10
    • 2015-12-29
    • 2013-04-25
    相关资源
    最近更新 更多