Проверяет минимальную и максимальную длину строки, но оставляя ее пустой - PullRequest
74 голосов
/ 14 декабря 2010

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

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

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

Ответы [ 9 ]

121 голосов
/ 14 декабря 2010

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

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

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

111 голосов
/ 22 февраля 2013

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

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

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

validates :foo, length: {is: 5}, allow_blank: true
11 голосов
/ 14 декабря 2010

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

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

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

8 голосов
/ 10 марта 2013

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

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

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

3 голосов
/ 14 декабря 2010

каждый validates_ * принимает: если или: если опции

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 голосов
/ 07 декабря 2016

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

2 голосов
/ 03 августа 2016
validates_length_of :reason, minimum: 3, maximum: 30

rspec для того же -

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
0 голосов
/ 10 сентября 2018

Добавьте в свою модель:

validates :color, length: { is: 7 }

цвет строки:

t.string :color, null: false, default: '#0093FF', limit: 7
0 голосов
/ 14 декабря 2010

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

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...