Tenho um campo que gostaria de validar. Desejo que o campo possa ser deixado em branco, mas se um usuário estiver inserindo dados, desejo que estejam em um determinado formato. Atualmente estou usando as validações abaixo no modelo, mas isso não permite que o usuário deixe em branco:
validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
Como escrevo isso para cumprir meu objetivo?
ruby-on-rails
ruby
validation
model
bgadoci
fonte
fonte
Você também pode usar este formato:
validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true
Ou, como seu mínimo e máximo são iguais, o seguinte também funcionará:
validates :foo, length: {is: 5}, allow_blank: true
fonte
Da documentação validates_length_of :
validates_length_of :phone, :in => 7..32, :allow_blank => true
fonte
Ou ainda mais conciso (com a nova sintaxe hash), a partir da documentação de validação :
validates :foo, length: 5..5, allow_blank: true
O limite superior provavelmente deve representar algo mais significativo como "em: 5..20", mas apenas responder à pergunta ao pé da letra.
fonte
in
que funcionará com cordas, parece ser apenas númerosvalidates :foo, length: 2..5, allow_blank: true
mas `length: {is: 5}` faria no caso do OPtodo validates_ * aceita: if ou: menos opções
validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition
onde validate_foo_condition é o método que retorna verdadeiro ou falso
você também pode passar um objeto Proc:
validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
fonte
validates_length_of :reason, minimum: 3, maximum: 30
rspec para o mesmo é
it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
fonte
Que tal:
validates_length_of :foo, is: 3, allow_blank: true
fonte
Adicione em seu modelo:
validates :color, length: { is: 7 }
a cor é uma string:
t.string :color, null: false, default: '#0093FF', limit: 7
fonte
Em seu modelo, por exemplo
def validate errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc? end
fonte