Rails数据库默认值和布尔字段的模型验证

时间:2012-05-08 21:11:42

标签: ruby-on-rails activerecord ruby-on-rails-3.2

在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):

4 个答案:

答案 0 :(得分:48)

来自here

  

如果要验证是否存在布尔字段(其中   你会想要使用真正的价值观是真是假   validates_inclusion_of:field_name,:in => [true,false]这是应该的   对象#空白的方式?处理布尔值。 false.blank? #=>   真

或者以Rails3方式

validates :field, :inclusion => {:in => [true, false]}

答案 1 :(得分:1)

我用以下方法解决了这个问题:

validates_presence_of :is_subscriber, :if => 'is_subscriber.nil?'

答案 2 :(得分:1)

我认为将它包装在自定义验证器中更为简洁。

/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/"]

(不要忘记重新启动服务器以加载它)

然后,您可以使用

更加整齐地验证
validates: :field1, field2, is_boolean: true

答案 3 :(得分:0)

validates :column_name, :inclusion => {:in => [true, false]}