Rails: Validando o comprimento mínimo e máximo de uma string, mas permitindo que fique em branco


87

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?

Respostas:



130

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


11

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.


Em não acho inque funcionará com cordas, parece ser apenas números
ecoologic

1
Isso deve funcionar, validates :foo, length: 2..5, allow_blank: truemas `length: {is: 5}` faria no caso do OP
PhilT

3

todo 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?}

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

2

Que tal: validates_length_of :foo, is: 3, allow_blank: true


-1

Adicione em seu modelo:

validates :color, length: { is: 7 }

a cor é uma string:

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

-4

Em seu modelo, por exemplo

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.