假设我为了让用户输入的数据长度不超过数据库定义的长度,定义了如下validation:
上面代码的行为有时却颇为怪异:
注意当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
- 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