Rails 3: как я могу проверить допустимость пробелов (""), но не nil (NULL в базе данных)

В 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,
}

Но либо он допускает как "", так и ниль или ни один из них.

Ответы

Ответ 1

Вам может потребоваться выполнить специальную проверку для этого:

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

Ответ 2

Это работает для меня

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

Если вы просто хотите проверить, что поле не пустое, но не заботятся о пустых/пустых строках, это работает:

  validates :my_string, length: { minimum: 0, allow_nil: false, message: "can't be nil" }

Ответ 3

Вы можете попробовать:

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

Это часть самих проверок в ActiveRecord.

Я пробовал другие, и все они очень уступчивы или допускают нуль.

Ответ 4

Или, может быть:

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

Кажется, что allow_nil не переопределяет allow_blank. Поэтому вам лучше не указывать allow_blank

Ответ 5

Вы можете создать простой пользовательский валидатор (помещенный в app/validators dir)

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

Ответ 6

Это работает для меня:

validates_exclusion_of :my_string, in: [nil]