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 }

フィールドがnullでないことを検証したいだけで、空白/空の文字列を気にしない場合は、次のように機能します。

  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 に答える