2

私はRuby、Sinatra、および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

私ができるようにしたいのは、エラーが発生したプロパティを特定することです。このようにして、たとえば、登録フォームの適切なフィールドの横にエラーメッセージを配置できる場合があります。つまり、エラーメッセージを表示する前に、登録者が無効なユーザー名を入力したことを知りたいので、ユーザー名フィールドの横にメッセージを配置できます。

これは可能ですか?

4

3 に答える 3

2

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

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 
于 2012-04-03T20:08:30.090 に答える
1

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

データマッパーソース60行目を確認してください。

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

つまり、これを実行できるということです

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

これが明らかでない理由は、Violation's#to_sメソッドがエイリアス化されてmessageおり、渡されたオブジェクトを呼び出すためです。したがって、呼び出すputsと実際に出力されます。#to_sputs errorerror.message

于 2012-04-02T18:05:23.727 に答える
1

以下により、フィールドに固有のエラーを取得できることがわかりました。

user.errors.keys.each do |key|
  user.errors[key].each do |error|
    puts "#{key} => #{error}"
  end
end
于 2014-02-26T21:40:14.530 に答える