3

我正在使用 Sinatra 和 DataMapper 开发一个 RESTful API。当我的模型验证失败时,我想返回 JSON 以指示哪些字段出错。DataMapper 为我的 type 模型添加了一个 'errors' 属性DataMapper::Validations::ValidationErrors。我想返回这个属性的 JSON 表示。

这是一个单文件示例(一定要喜欢 Ruby/Sinatra/DataMapper!):

require 'sinatra'
require 'data_mapper'
require 'json'


class Person
    include DataMapper::Resource

    property :id, Serial
    property :first_name, String, :required => true
    property :middle_name, String
    property :last_name, String, :required => true
end


DataMapper.setup :default, 'sqlite::memory:'
DataMapper.auto_migrate!


get '/person' do
    person = Person.new :first_name => 'Dave'
    if person.save
        person.to_json
    else
        # person.errors - what to do with this?
        { :errors => [:last_name => ['Last name must not be blank']] }.to_json
    end
end


Sinatra::Application.run!

在我的实际应用程序中,我正在处理 POST 或 PUT,但为了使问题易于重现,我使用 GET 以便您可以使用浏览器或浏览器。curl http://example.com:4567/person

所以,我所拥有的是person.errors,我正在寻找的 JSON 输出就像哈希产生的一样:

{"errors":{"last_name":["Last name must not be blank"]}}

我需要做什么才能得到DataMapper::Validations::ValidationErrors我想要的 JSON 格式?

4

2 回答 2

5

所以,当我打字的时候,答案就来了(当然!)。我已经花了几个小时试图弄清楚这一点,我希望这能避免其他人经历我所经历的痛苦和沮丧。

为了得到我正在寻找的 JSON,我只需要创建一个像这样的哈希:

{ :errors => person.errors.to_h }.to_json

所以,现在我的 Sinatra 路线看起来像这样:

get '/person' do
    person = Person.new :first_name => 'Dave'
    if person.save
        person.to_json
    else
        { :errors => person.errors.to_h }.to_json
    end
end

希望这可以帮助其他希望解决此问题的人。

于 2012-12-05T03:08:52.687 回答
0

我知道,我回答得这么晚了,但是,如果您只是在寻找验证错误消息,您可以使用object.errors.full_messages.to_json. 例如

person.errors.full_messages.to_json

会导致类似

"[\"Name must not be blank\",\"Code must not be blank\",
   \"Code must be a number\",\"Jobtype must not be blank\"]"

这将在客户端从迭代键值对中解救出来。

于 2012-12-06T06:41:22.303 回答