30

在 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

4 回答 4

55

这里

如果要验证布尔字段的存在(其中真实值为真和假),您将需要使用 validates_inclusion_of :field_name, :in => [true, false] 这是由于 Object#blank? 处理布尔值。假的空白?# => 真

或以 Rails3 方式

validates :field, :inclusion => {:in => [true, false]}
于 2012-05-08T21:18:08.180 回答
1

我已经解决了这个问题:

validates_presence_of :is_subscriber, :if => 'is_subscriber.nil?'
于 2014-11-25T15:12:14.067 回答
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
于 2016-11-28T15:17:25.250 回答
0
validates :column_name, :inclusion => {:in => [true, false]}
于 2020-06-22T19:50:42.880 回答