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.   
  3. >> u = User.new      
  4. =>  # 
  5. >> u.valid?      
  6. => false      
  7. >> u.errors.full_messages      
  8. =>["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    

你可能感兴趣的:(Ruby,Rails,ActiveRecord)