假設我為了讓使用者輸入的資料長度不超過資料庫定義的長度,定義了如下validation: ruby 代碼
- class User < ActiveRecord::Base
- validates_length_of :name, :maximum => 50
- end
上面代碼的行為有時卻頗為怪異: ruby 代碼
- ruby script/console
- >> u = User.new
- => #
- >> u.valid?
- => false
- >> u.errors.full_messages
- =>["Name is too long (maximum is 50 characters)"]
注意當user對象的name為nil時,輸出的錯誤卻是["name is too long (maximum is 50 characters)"],驢唇不對馬嘴!但事實确實如此,為什麼?原因在于rails的所有validation方法都支援一個可選參數:allow_nil。allow_nil預設為false, 是以當user對象的name屬性為nil時, 盡管is nil與is too long是兩回事,validates_length_of :name, :maximum => 50 這個驗證卻不會通過。
當然你可以指定:allow_nil => true, 但問題是有些屬性不能為nil, 即是必須的屬性,這時就會想到validates_presence_of,我們可以對上面的代碼做改進: ruby 代碼
- class User < ActiveRecord::Base
- validates_length_of :name, :maximum => 50, :allow_nil => true
- validates_presence_of :name
- end