Rails数据库默认值和布尔字段的模型validation
在Rails模型中,我有一个属性is_subscriber
,当我构建一个db迁移以将此列添加到数据库时,我将默认值指定为false:
t.boolean "is_subscriber", :default => false
我还在模型中指定需要存在此属性:
validates :is_subscriber, presence: true
那么为什么在创建模型实例时却没有指定此属性会出现此错误?
2012-05-08T21:05:54+00:00 app[web.1]: ActiveRecord::RecordInvalid (Validation failed: Is subscriber can't be blank):
从这里开始
如果要validation是否存在布尔字段(实际值为true和false),您将需要使用validates_inclusion_of:field_name,:in => [true,false]这是由于Object#blank的方式? 处理布尔值。 false.blank? #=>是的
或者以Rails3的方式
validates :field, :inclusion => {:in => [true, false]}
我用以下方法解决了这个问题:
validates_presence_of :is_subscriber, :if => 'is_subscriber.nil?'
我认为将它包装在自定义validation器中更为简洁。
在/app/validators/is_boolean_validator.rb
class IsBooleanValidator < ActiveModel::EachValidator def validate_each(record, attribute, parameters) if !parameters.in? [true,false] record.errors[attribute] << 'This must be true or false.' end end end
然后你必须通过将以下内容添加到/config/application.rb
来确保加载它
config.autoload_paths += %W["#{config.root}/app/validators/"]
(别忘了重新启动服务器来加载它)
然后,您可以更加整洁地validation
validates: :field1, field2, is_boolean: true