3

SinatraとDataMapperを使用してRESTfulAPIを開発しています。モデルが検証に失敗した場合、エラーが発生したフィールドを示すためにJSONを返したいと思います。DataMapperは、タイプのモデルに「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"]}}

必要なJSON形式にするにはどうすればよいDataMapper::Validations::ValidationErrorsですか?

4

2 に答える 2

5

それで、私がこれをタイプしているときに、答えが私に来ました(もちろん!)。私はこれを理解しようとして数時間燃やしました、そしてこれが私が経験した痛みと欲求不満を他の人に救うことを願っています。

探しているJSONを取得するには、次のようなハッシュを作成する必要がありました。

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

だから、今私のシナトラルートは次のようになります:

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 に答える