2012-12-05 37 views
3

我正在開發一個使用Sinatra和DataMapper的RESTful API。當我的模型未通過驗證時,我想返回JSON以指示哪些字段出錯。 DataMapper爲我的模型DataMapper::Validations::ValidationErrors添加了一個「錯誤」屬性。我想返回此屬性的JSON表示。如何在Sinatra中序列化DataMapper :: Validations :: ValidationErrors to_json?

這裏有一個單一文件的例子(愛是愛的Ruby /西納特拉/ 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格式的我想?

回答

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 

希望這幫助其他人尋求解決這個問題。

+0

是的,這是一種做法,對我來說要求有點不同。如果你正在尋找錯誤消息的響應'JSON'檢查我的答案。 – ch4nd4n

+0

有趣...感謝您的信息。對我而言,我需要將錯誤消息與客戶端上表單上的輸入字段相關聯。該名稱是進行該關聯所必需的。 – AnyWareFx

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\"]" 

這將在客戶端營救遍歷鍵值對。

相關問題