2012-04-02 12 views
2

私はRuby、Sinatra、およびDataMapperについては比較的新しいですが、DataMapper検証エラーについて質問があります。DataMapper検証エラーのソースプロパティを確認してください

私はあなたが以下のような何かを行うことによって、DataMapperの持つデータベースに新しい行を保存しようとしたときに発生したエラーを見ることができます知っている:

user = User.new username: 'bradleygriffith', password: 'not_my_password' 
if user.save 
    #success! 
else 
    user.errors.each do |error| 
    puts error 
    end 
end 

私が行うことができるようにしたいと思い、何が決定していますどのプロパティでエラーが発生したかを示します。この方法では、たとえば、登録フォームの該当するフィールドの隣にエラーメッセージを配置することができます。つまり、登録者が、無効なユーザー名の前にのエラーメッセージが表示されたので、ユーザー名フィールドにメッセージを置くことができることを知りたいと思います。

これは可能ですか?

答えて

2

errorsオブジェクトはエラーがない場合は、パラメータとして渡し、又はnilプロパティのすべての検証エラーメッセージを含む配列が返されon方法を有するDataMapper::Validations::ValidationErrorsのインスタンスです。 (これらのドキュメントは実際に実装と一致しないように見えます)。

user = User.new username: 'joe', :age => 40 

if user.save 
    #success! 
else 
    puts "Username: #{user.username} #{user.errors.on(:username)}" 
    puts "Age: #{user.age} #{user.errors.on(:age)}" 
end 

(セットアップ、適切な検証で)生成:

Username: joe ["Username must be between 4 and 20 characters long"] 
Age: 40 
1

モデルクラスのerrors属性のすべての項目は、attribute_nameというプロパティを持つDataMapper::Validation::Violationのインスタンスです。

datamapper sourceline 60を確認してください。

#... 
def attribute_name 
    if @attribute_name 
    @attribute_name 
    elsif rule 
    rule.attribute_name 
    end 
end 
#... 

だから、あなたがViolation#to_s方法がmessageputsにエイリアスされているので、これは明らかではなかったかもしれない理由がに渡された任意のオブジェクトに#to_sを呼び出します。この

user = User.new username: 'bradleygriffith', password: 'not_my_password' 
if user.save 
    #success! 
else 
    user.errors.each do |error| 
     #print the name of the invalid attribute 
     puts error.attribute_name 
    end 
end 

を行うことができることを意味それで、puts errorに電話すると、実際にはerror.messageが印刷されます。

+1

Imが取得:「NoMethodErrorをat/join。未定義のメソッド 'attribute_name'は["Username is already taken"]:配列 " ですか? – bradleygriffith

+0

hmm、配列にどのような種類のオブジェクトがあるかを見るには、これを 'puts error [0] .class.name'とします。文字列のように見えますが、私たちを騙しているかもしれません。あなたがこのことを理解してくれたら教えてください。 – jacobsimeon

1

私は次のようにあなたがフィールドに特定のエラーを取得することを可能にすることがわかった:

user.errors.keys.each do |key| 
    user.errors[key].each do |error| 
    puts "#{key} => #{error}" 
    end 
end 
関連する問題