如何在rails 5中向json异常响应添加属性

时间:2017-04-27 21:42:00

标签: ruby-on-rails json ruby-on-rails-5

当我在我的api REST应用程序中调用服务时,例如" localhost / api / boxes / 56"如果id值不存在于我的数据库中,我会得到一个RecordNotFoundException并且呈现的json看起来像:

{
  "status": 404,
  "error": "Not Found",
  "exception": "#<ActiveRecord::RecordNotFound: Couldn't find Box with 'id'=56>",
  "traces": {
    "Application Trace": [
      {
        "id": 1,
        "trace": "app/controllers/api/v1/boxes_controller.rb:47:in `set_box'"
      }
    ],
    "Framework Trace": [
      {
        "id": 0,
        "trace": "activerecord (5.0.2) lib/active_record/core.rb:173:in `find'"
      },...
    ],
    "Full Trace": [
      {
        "id": 0,
        "trace": "activerecord (5.0.2) lib/active_record/core.rb:173:in `find'"
      },...
    ]
  }
}

我如何以及通过什么类来覆盖以添加&#34;消息&#34;此例外属性?

1 个答案:

答案 0 :(得分:2)

如果您尝试通过ID或其他任何方式在数据库中获取记录,则可以处理是否通过自己的验证找不到记录:

record = Record.find(params[:id])

然后您可以检查该记录是否为nil,因为找不到它,可能是一个错误的请求,然后根据需要渲染json,如:

if !record.nil?
  render json: record, status: 200
else
  render json: bad_request
end

bad_request方法在ApplicationController中定义,如:

def bad_request
  {
    error: 'Record not found, maybe a bad request',
    status: 400
  }
end

或者,如果另一方面,您希望直接在正在触发的方法上处理和设置自己对该行为的响应,那么您可以rescue ActiveRecord::RecordNotFound例外,例如:

def show
  box = Box.find(params[:id])
  render json: box, status: 200
rescue ActiveRecord::RecordNotFound
  render json: { error: 'Baaaaaad' }
end

此外,如果您想让所有模型都可以使用此操作,您可以使用rescue_from中的ApplicationController方法,并将异常设置为“catch”,然后设置将响应的方法,像:

class ApplicationController < ActionController::Base
  ...
  rescue_from ActiveRecord::RecordNotFound, with: :damn_nothing_found

  def damn_nothing_found
    render json: { error: 'nothing found :c' }, status: :not_found
  end
end