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


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

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

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

9 66

9 ответов:

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

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

примеры: ActiveRecord::Validations:: ClassMethods

вы также можете использовать следующий формат:

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

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

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

С validates_length_of documentation:

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

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

или даже более кратким (с новым синтаксисом хэша), от проверка документов:

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

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

каждый 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?}

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

validates_length_of :reason, minimum: 3, maximum: 30

rspec для того же является

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

добавить модели:

validates :color, length: { is: 7 }

цвета-это строка:

t.string :color, null: false, default: '#0093FF', limit: 7

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

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