Grape 中的 ActiveRecord 验证错误 API
ActiveRecord Validation errors in Grape API
我正在使用 Grape 创建我的第一个 Web 服务,我对一件事感到困惑。当 POST 请求未通过 AR 验证时,我该如何响应 ActiveRecord 验证错误?
在我的 Foo 模型中我有这个:
validates :bar, {
presence: true,
uniqueness: true
}
我的 Foo 在 Grape 中创建 API 看起来像这样:
desc "Create a new Foo"
params do
requires :bar, type: String, allow_blank: false
end
post do
::Foo.create!({
bar: params[:bar]
})
end
例如,当我创建一个带有 Duplicate Bar 的 Foo 时,我会看到一个标准的 Rails 错误页面(使用 Postman)。如何确保我的所有错误仅作为 JSON 个对象返回?
PS。我在 API class:
中设置了以下说明
default_format :json
format :json
formatter :json, Grape::Formatter::ActiveModelSerializers
这是一个简单的例子:
get "" do
begin
present Region.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
not_found_error(e)
end
end
所以我创建了简单的助手:
module YourApi::V1::ErrorsHelper
def not_found_error(e)
error!({ error: { message: "#{e.message}", error: "#{e.class} error", code: 404 }}, 404)
end
end
因此,只需使用方法 error!
并使用您想要的方式处理消息、类型和代码。
您可以在 API 模块中使用带有参数 ActiveRecord::RecordInvalid
的方法 rescue_from
,我认为这是一种更优雅的方式来实现您的目标。将块传递给该方法将允许您获取错误消息并进一步处理它。这样您将获得一种统一的方式来处理所有验证错误。
例如:
rescue_from ActiveRecord::RecordInvalid do |error|
message = error.record.errors.messages.map { |attr, msg| msg.first }
error!(message.join(", "), 404)
end
我正在使用 Grape 创建我的第一个 Web 服务,我对一件事感到困惑。当 POST 请求未通过 AR 验证时,我该如何响应 ActiveRecord 验证错误?
在我的 Foo 模型中我有这个:
validates :bar, {
presence: true,
uniqueness: true
}
我的 Foo 在 Grape 中创建 API 看起来像这样:
desc "Create a new Foo"
params do
requires :bar, type: String, allow_blank: false
end
post do
::Foo.create!({
bar: params[:bar]
})
end
例如,当我创建一个带有 Duplicate Bar 的 Foo 时,我会看到一个标准的 Rails 错误页面(使用 Postman)。如何确保我的所有错误仅作为 JSON 个对象返回?
PS。我在 API class:
中设置了以下说明default_format :json
format :json
formatter :json, Grape::Formatter::ActiveModelSerializers
这是一个简单的例子:
get "" do
begin
present Region.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
not_found_error(e)
end
end
所以我创建了简单的助手:
module YourApi::V1::ErrorsHelper
def not_found_error(e)
error!({ error: { message: "#{e.message}", error: "#{e.class} error", code: 404 }}, 404)
end
end
因此,只需使用方法 error!
并使用您想要的方式处理消息、类型和代码。
您可以在 API 模块中使用带有参数 ActiveRecord::RecordInvalid
的方法 rescue_from
,我认为这是一种更优雅的方式来实现您的目标。将块传递给该方法将允许您获取错误消息并进一步处理它。这样您将获得一种统一的方式来处理所有验证错误。
例如:
rescue_from ActiveRecord::RecordInvalid do |error|
message = error.record.errors.messages.map { |attr, msg| msg.first }
error!(message.join(", "), 404)
end