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]