かなり複雑なバリデーションをコード化する必要がある場合、エラーは特定の属性に存在しない場合がありますが、それらのいくつかを組み合わせたものです。ActiveRecordオブジェクトに特定の属性を関連付けることなくエラーを追加することはできますか?
たとえば、start_dateと:end_dateの間に日曜日が含まれていないことを検証したい場合、エラーはこれらのフィールドのいずれかに固有のものではありませんが、エラーの追加メソッドで指定する必要があります。
かなり複雑なバリデーションをコード化する必要がある場合、エラーは特定の属性に存在しない場合がありますが、それらのいくつかを組み合わせたものです。ActiveRecordオブジェクトに特定の属性を関連付けることなくエラーを追加することはできますか?
たとえば、start_dateと:end_dateの間に日曜日が含まれていないことを検証したい場合、エラーはこれらのフィールドのいずれかに固有のものではありませんが、エラーの追加メソッドで指定する必要があります。
このような何かをやってみてください。
# 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."
を少しだけより説明:
errors[:base]
を使用して、特定の属性に具体的に関連付けられていない一般的なエラー(rails guide link)を追加できます。
model_instance.errors[:base] << "msg"
あなたが実際にあなたが好きなものは何でもハッシュキーに名前を付けることができます。
上記の回答は古くなっています。 Rails 5以降では、最初のパラメータとして:base
でActiveModel::Errors addメソッドを呼び出す必要があります。以下の例を参照してください。
model_instance.errors.add(
:base,
:name_or_email_blank,
message: "either name or email must be present"
)
完璧な、これは私が必要としたものです。ドキュメント内で見つけることができません –
エラーハッシュのベースは何ですか? – holaSenor
通常、特定の属性にエラーを追加できます。たとえば、 'age'属性を持つ' User'モデルがあった場合、その属性にエラーを追加して、 'self.errors [:age] <<と書くことができます。 ""これは "年齢は0未満ではありません"のようなエラーになります。しかし、エラーが特定の属性に関するものではない場合は、それをベース、つまりモデル自体に追加できます。だから 'self.errors [:base] <<"すべてが間違っている! "というエラーメッセージは"すべてが間違っている! "特定の属性には接続されていません。 – MrDanA