Rails: проверка минимальной и максимальной длины строки, но позволяющая ей быть пустой


87

У меня есть поле, которое я хотел бы проверить. Я хочу, чтобы поле можно было оставить пустым, но если пользователь вводит данные, я хочу, чтобы они были в определенном формате. В настоящее время я использую в модели следующие проверки, но это не позволяет пользователю оставлять поле пустым:

validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5

Как мне написать это, чтобы достичь своей цели?

Ответы:


135

Думаю, может понадобиться что-то вроде:

validates_length_of :foo, minimum: 5, maximum: 5, allow_blank: true

Дополнительные примеры: ActiveRecord :: Validations :: ClassMethods


7
для определенного размера вы можете использовать ограничение длины: is
GuiGreg

130

Вы также можете использовать этот формат:

validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true

Или, поскольку ваши min и max одинаковы, также будет работать следующее:

validates :foo, length: {is: 5}, allow_blank: true


11

Или еще более кратко (с новым синтаксисом хеширования) из документации по валидации :

validates :foo, length: 5..5, allow_blank: true

Верхний предел, вероятно, должен представлять что-то более значимое, например "in: 5..20", но просто ответ на вопрос по букве.


Не думаю, что inбудет работать со строками, похоже, только числа
ecoologic

1
Вместо этого это должно сработать, validates :foo, length: 2..5, allow_blank: trueно в случае OP
подойдет

3

каждый validates_ * принимает: if или: except параметры

validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition

где validate_foo_condition - это метод, который возвращает true или false

вы также можете передать объект Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}

2
validates_length_of :reason, minimum: 3, maximum: 30

rspec для того же самого

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.