21

在 ActiveRecord(或 ActiveModel)中,我希望通过以下规范

it { should allow_value("").for(:my_string) }
it { should_not allow_value(nil).for(:my_string) }

我努力了

validates :my_string, {
  :length => { :in => 0..255 },
  :presence => true,
  :allow_blank => true,
  :allow_nil => false,
}

并且

validates :my_string, {
  :length => { :in => 0..255 },
  :allow_blank => true,
  :allow_nil => false,
}

但要么它允许 "" 和 nil 要么都不允许。

4

6 回答 6

36

这对我有用

  validates :my_string, length: { in: 0..255, allow_nil: false }

如果您只想验证该字段不为空,但不关心空白/空字符串,则此方法有效:

  validates :my_string, length: { minimum: 0, allow_nil: false, message: "can't be nil" }
于 2013-12-06T20:09:49.730 回答
10

您可以尝试这样做:

validates :my_string, exclusion: { in: [nil]}

它是 ActiveRecord 中验证本身的一部分。

我已经尝试过其他的,它们都非常复杂,或者也允许 nil。

于 2017-12-15T13:05:34.950 回答
6

您可能需要为此进行自定义验证:

validates :my_string, :length => { :in => 0..255 }
validate :my_string_is_valid

def my_string_is_valid
  self.errors.add :base, 'My string can not be nil' if self.my_string.nil? 
end
于 2012-09-12T20:35:49.310 回答
3

您可以创建一个简单的自定义验证器(放在app/validatorsdir 中)

class NotNilValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << "must not be nil" if value.nil?
  end
end

接着

validates :my_string, not_nil: true
于 2015-02-24T13:27:01.217 回答
1

或者可能:

validates :my_string, :length => { :in => 0..255 }, :allow_nil => false

似乎allow_nil不会覆盖allow_blank. 所以你最好不要指定allow_blank

于 2012-09-12T20:49:48.200 回答
0

这对我有用:

validates_exclusion_of :my_string, in: [nil]
于 2019-05-06T08:20:02.113 回答