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?

bgadoci
fonte

Respostas:

135

Acho que pode precisar de algo como:

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

Mais exemplos: ActiveRecord :: Validations :: ClassMethods

DigitalRoss
fonte
7
para um tamanho específico, você pode usar a restrição de comprimento: é
GuiGreg
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
Quainjn
fonte
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.

Companheiro estranho
fonte
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?}
tom-chave
fonte
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) }
shiva kumar
fonte
2

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

shem
fonte
-1

Adicione em seu modelo:

validates :color, length: { is: 7 }

a cor é uma string:

t.string :color, null: false, default: '#0093FF', limit: 7
Marlon Henry Schweigert
fonte
-4

Em seu modelo, por exemplo

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