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