Ruby on Rails/ActiveRecord/Validations
ActiveRecord 支援各種模型驗證方法,並允許根據需要新增新方法。
此外,您可以使用以下方法將驗證應用於一個或多個屬性:validate_each指令
class Person < ActiveRecord::Base
validates_each :first_name, :last_name do |record, attr, value|
record.errors.add attr, 'starts with z.' if value[0] == ?z
end
end
也可以透過自定義方法或塊定義驗證
- validate
- validate_on_create
- validate_on_update
例如
class Person < ActiveRecord::Base
validate :validate_email
def validate_email
record.errors.add :email, 'Invalid email' unless email =~ /@/
end
end
通常,驗證發生在每次建立或儲存記錄時,但是您可以使用以下方法強制驗證*不*發生:save_with_validation方法傳遞@false@作為引數。
validates_acceptance_of :play_rules
如果您需要檢查使用者是否設定或“接受”了某個複選框,可以使用此驗證。在這種情況下,具有 HTML 屬性“name='play_rules'”的複選框需要被選中才能透過驗證。
此驗證器檢查輸入欄位是否兩次都輸入正確。例如,如果您希望使用者兩次輸入他的密碼以確保他輸入了正確的密碼(這在網站註冊時經常看到),那麼這就是您要使用的助手。要使用它,請確保在您的檢視中正確定義它(注意_confirmation)
<%= text_field :user, :password%>
<%= text_field :user, :password_confirmation %>
validates_format_of接受一個正則表示式,並檢查輸入是否與 :with 子句提供的模式匹配。還要注意,我們在這裡使用了一個自定義訊息。這可以在每個驗證器中以相同的方式完成。
validates_format_of :username, :with => /\A[a-zA-Z]+\z/, :message => "Please use only regular letters as username"
validates_length_of :username, :minimum => 5, :maximum => 50
validates_size_of :address, :in => 5..100
該length_of/size_of驗證器在您需要檢查輸入的字元長度是否滿足特定要求時很有用。在上面的示例中,使用者名稱長度不能超過 50 個字元,也不能少於 5 個字元。或者,您可以指定一個範圍,該範圍應該為真才能驗證。上面,地址應該包含 5 到 100 個字元。請注意length_of和size_of/是相同的。
validates_numericality_of :amount_available
檢查輸入是否為任何型別的數字。為了確保輸入只是整數,您可以使用可選的:only_integer => true命令。此命令有一些有用的選項,例如:greater_than => 100確保給定的數字大於 100:因此 101 將是第一個有效數字。
validates_presence_of :name
最基本的驗證器之一,它檢查給定的表單元素(在本例中為“name”)中是否輸入了任何內容。
validates_uniqueness_of :username
最後,一個比較高階的驗證器:它檢查資料庫中是否存在指定的屬性值。在這種情況下,如果使用者選擇使用者名稱“Paul”,而“Paul”已經存在於資料庫的使用者名稱列中,則它將不會透過驗證。
它還可以驗證指定屬性的值是否基於多個範圍引數是唯一的。例如,確保老師在某個學期只能在某個特定課程的課程表中出現一次。
validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
建立記錄時,會執行檢查以確保資料庫中不存在具有指定屬性(對映到列)的給定值的記錄。更新記錄時,會進行相同的檢查,但會忽略記錄本身。
- message - 指定自定義錯誤訊息(預設值為:“已被使用”)
- scope - 一個或多個用於限制唯一約束範圍的列。
- if - 指定要呼叫的方法、proc 或字串以確定是否應進行驗證(例如 :if => :allow_validation,或 :if => Proc.new { |user| user.signup_step > 2 })。方法、proc 或字串應該返回或計算為真值或假值。
編寫驗證時,請記住您可以將所有這些選項混合使用,並且還有更多高階功能,您可能想檢視一下。