5

Rails2からRails3への移行に伴い、検証エラーはActiveRecord::ErrorからActiveModel::Errorsに移動されました。
Rails 2では、検証エラーにはタイプとメッセージ(とりわけ)があり、次のように実行することで検証エラーのタイプを確認できます。

rescue ActiveRecord::RecordInvalid => e
  e.record.errors.each do |attr, error|
    if error.type == :foo
      do_something
    end
  end
end

しかし、Rails 3では、無効な属性とメッセージ以外はすべて失われているようです。結果として、タイプを判別する唯一の方法は、エラーメッセージを比較することです。

rescue ActiveRecord::RecordInvalid => e
  e.record.errors.each do |attr, error|
    if error == "foobar"
      do_something
    end
  end
end

これはまったく理想的ではありません(たとえば、同じメッセージを使用する複数の検証がある場合はどうなりますか?)。

質問:
Rails 3.0には、検証エラーのタイプを判別するためのより良い方法がありますか?

4

2 に答える 2

4

追加を確認しますか?ActiveModel::エラーについて:

https://github.com/rails/rails/blob/master/activemodel/lib/active_model/errors.rb#L331

これにより、次のことが可能になります。

record.errors.added?(:field, :error)
于 2012-09-28T20:48:19.957 に答える