当我在我的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;此例外属性?
答案 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