天天看點

Gotchas in rails validation

假設我為了讓使用者輸入的資料長度不超過資料庫定義的長度,定義了如下validation: ruby 代碼  

  1. class User < ActiveRecord::Base  
  2.   validates_length_of :name,  :maximum => 50  
  3. end  

上面代碼的行為有時卻頗為怪異: ruby 代碼  

  1. ruby script/console  
  2. >> u = User.new      
  3. =>  # 
  4. >> u.valid?      
  5. => false      
  6. >> u.errors.full_messages      
  7. =>["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 代碼  

  1. class User < ActiveRecord::Base    
  2.   validates_length_of :name, :maximum => 50,  :allow_nil => true  
  3.   validates_presence_of :name    
  4. end