如果您需要編寫相當複雜的驗證代碼,錯誤有時不在於某個特定屬性,而是包含在其中幾個屬性的組合中。是否可以將錯誤添加到ActiveRecord對象而不將它們與特定屬性相關聯?
例如,如果我想驗證start_date和end_date之間的時間段不包含任何星期日,則錯誤不屬於這兩個字段中的任何一個,但Errors add方法需要指定它。
如果您需要編寫相當複雜的驗證代碼,錯誤有時不在於某個特定屬性,而是包含在其中幾個屬性的組合中。是否可以將錯誤添加到ActiveRecord對象而不將它們與特定屬性相關聯?
例如,如果我想驗證start_date和end_date之間的時間段不包含任何星期日,則錯誤不屬於這兩個字段中的任何一個,但Errors add方法需要指定它。
嘗試做這樣的事情:
# 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
基本上,你可以添加你自己的複雜的驗證的模型,當你看到一些錯誤已經發生了,你可以在陣列中添加一個錯誤字符串錯誤。
您可以使用errors[:base]
添加一般性錯誤,這些錯誤並不是與一個屬性特別綁定的 - rails guide link。
model_instance.errors[:base] << "msg"
實際上,你可以命名你喜歡的任何哈希鍵:
instance.errors[:case_of_the_sundays] << "Error, son."
只是一點點更多的描述。
以上答案已過時。對於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 「'這會產生像」年齡不能小於0「的錯誤。但是,如果錯誤不是關於任何特定的屬性,您可以將其添加到基礎,即模型本身。所以'self.errors [:base] <<「一切都是錯誤的!」會產生錯誤信息「一切都是錯誤的!它沒有連接到任何特定的屬性。 – MrDanA