Rails: перевіряє мінімальну та максимальну довжину рядка, але дозволяє порожнім


87

У мене є поле, яке я хотів би перевірити. Я хочу, щоб поле залишалося порожнім, але якщо користувач вводить дані, я хочу, щоб воно було у певному форматі. На даний момент я використовую наведені нижче перевірки в моделі, але це не дозволяє користувачеві залишати це порожнім:

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

Як написати це для досягнення своєї мети?

Відповіді:



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

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


Не думаю, що inбуде працювати зі рядками, здається, це лише цифри
ecoologic

1
Натомість це має спрацювати, validates :foo, length: 2..5, allow_blank: trueале `length: {is: 5}` зробить це у випадку з ОП
PhilT

3

кожен validates_ * приймає: if або: хіба що параметри

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



-4

Наприклад, у вашій моделі

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.