Ответ 1
Я думаю, что может понадобиться что-то вроде:
validates_length_of :foo, :minimum => 5, :maximum => 5, :allow_blank => true
Другие примеры: ActiveRecord:: Validations:: ClassMethods
У меня есть поле, которое я бы хотел проверить. Я хочу, чтобы поле оставалось пустым, но если пользователь вводит данные, я хочу, чтобы он находился в определенном формате. В настоящее время я использую следующие проверки в модели, но это не позволяет пользователю оставить его пустым:
validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
Как мне написать это для достижения моей цели?
Я думаю, что может понадобиться что-то вроде:
validates_length_of :foo, :minimum => 5, :maximum => 5, :allow_blank => true
Другие примеры: ActiveRecord:: Validations:: ClassMethods
Вы также можете использовать этот формат:
validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true
Или, так как ваши минимальные и максимальные значения совпадают, будет также работать следующее:
validates :foo, length: {is: 5}, allow_blank: true
Из validates_length_of документации:
validates_length_of :phone, :in => 7..32, :allow_blank => true
:allow_blank
- Атрибут может быть пустым; пропустить проверку.
Или еще более кратким (с новым синтаксисом хэша), из проверяет документацию:
validates :foo, length: 5..5, allow_blank: true
Верхний предел должен, вероятно, представлять нечто более значимое, как "in: 5..20", но просто отвечает на вопрос на письмо.
каждый 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?}
validates_length_of :reason, minimum: 3, maximum: 30
rspec для того же самого
it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
Как насчет этого:
validates_length_of :foo, is: 3, allow_blank: true
В вашей модели, например
def validate
errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end