2011-11-04 21 views
15

今、私が知っている通り、モデルがバリデーションに失敗したとしても、after_validationが呼び出されます。モデルが有効な場合にのみ呼び出す方法はありますか?私はreturn false unless self.valid?after_validationメソッドに追加しようとしましたが、検証を再度トリガし、無限ループを作成します。Ruby on Rails - 有効な場合、after_validation?

+2

さて、あなたは 'errors'をチェックすることができます。例えば、' self.errors.empty? 'または' errors.any?if falseを返します。 – tbuehlmann

答えて

16

失敗検証は、レコードのエラーに追加するので、あなただけのチェックができます

return false unless self.errors.empty? 
+0

これを前に試してみましたが、それでも失敗しました。それから、コードをチェックして、もう一度検証を呼びかけていたことに気が付きました(私が想定しなかったとき)。今それは完璧に動作します。ありがとうございました! –

2

代わりにbefore_saveコールバックの使用について考えましたか?

オブジェクトが有効な場合にのみ呼び出されると思います。

+2

保存したくない場合はどうすればいいですか?ちょうどそれを検証したいですか? –

+1

アソシエーションが最初に更新され、それによって 'changed'ハッシュがリセットされるので、' before_save'の中でアソシエーション内でどのフィールドが変更されたか( 'xxx_changed? '経由で)をチェックするような高度な処理はできません。したがって、回避策として 'after_validation'でこれらのチェックを実行する必要があります。 –

0

を、私はこれが古い質問です知っているが、モデルにカスタム検証を使用しているとき、私は同じエラーに遭遇しました私は作りました。 docsには、カスタムメソッドを扱う部分があり、.valid?メソッドのたびにこのような検証が呼び出されると記載されています。これはおそらく、:after_validationコールバックがトリガされたときに無限ループがトリガされた理由です。