2012-05-30 3 views
20

かなり複雑なバリデーションをコード化する必要がある場合、エラーは特定の属性に存在しない場合がありますが、それらのいくつかを組み合わせたものです。ActiveRecordオブジェクトに特定の属性を関連付けることなくエラーを追加することはできますか?

たとえば、start_dateと:end_dateの間に日曜日が含まれていないことを検証したい場合、エラーはこれらのフィールドのいずれかに固有のものではありませんが、エラーの追加メソッドで指定する必要があります。

答えて

29

このような何かをやってみてください。

# Your Model.rb 
validate :my_own_validation_method 

... 

private 

def my_own_validation_method 
    if there_is_no_sunday_in_the_range 
     self.errors[:base] << "You must have a Sunday in the time range!" 
    end 
end 

基本的に、あなたがモデルに独自の複雑な検証を追加することができ、あなたは間違った何かが起こったことを見たとき、あなたはの配列にエラー文字列を追加することができますエラー。

instance.errors[:case_of_the_sundays] << "Error, son." 

を少しだけより説明:

+1

完璧な、これは私が必要としたものです。ドキュメント内で見つけることができません –

+2

エラーハッシュのベースは何ですか? – holaSenor

+4

通常、特定の属性にエラーを追加できます。たとえば、 'age'属性を持つ' User'モデルがあった場合、その属性にエラーを追加して、 'self.errors [:age] <<と書くことができます。 ""これは "年齢は0未満ではありません"のようなエラーになります。しかし、エラーが特定の属性に関するものではない場合は、それをベース、つまりモデル自体に追加できます。だから 'self.errors [:base] <<"すべてが間違っている! "というエラーメッセージは"すべてが間違っている! "特定の属性には接続されていません。 – MrDanA

5

errors[:base]を使用して、特定の属性に具体的に関連付けられていない一般的なエラー(rails guide link)を追加できます。

7
model_instance.errors[:base] << "msg" 
1

あなたが実際にあなたが好きなものは何でもハッシュキーに名前を付けることができます。

0

上記の回答は古くなっています。 Rails 5以降では、最初のパラメータとして:baseActiveModel::Errors addメソッドを呼び出す必要があります。以下の例を参照してください。

model_instance.errors.add(
    :base, 
    :name_or_email_blank, 
    message: "either name or email must be present" 
) 
関連する問題