Подтвердить что ты не робот

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

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

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

Как мне написать это для достижения моей цели?

4b9b3361

Ответ 1

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

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

Другие примеры: ActiveRecord:: Validations:: ClassMethods

Ответ 2

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

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

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

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

Ответ 3

Из validates_length_of документации:

validates_length_of :phone, :in => 7..32, :allow_blank => true

:allow_blank - Атрибут может быть пустым; пропустить проверку.

Ответ 4

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

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

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

Ответ 5

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

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?}

Ответ 6

validates_length_of :reason, minimum: 3, maximum: 30

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

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

Ответ 7

Как насчет этого: validates_length_of :foo, is: 3, allow_blank: true

Ответ 8

В вашей модели, например

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end