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