web-dev-qa-db-fra.com

Valider les longueurs min et max d'une chaîne mais lui permettre d'être vide

J'ai un champ que je voudrais valider. Je souhaite que le champ puisse rester vide, mais si un utilisateur entre des données, je souhaite qu'elles soient dans un certain format. J'utilise actuellement les validations ci-dessous dans le modèle, mais cela ne permet pas à l'utilisateur de le laisser vide:

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

Comment puis-je écrire cela pour atteindre mon objectif?

70
bgadoci

Je pense qu'il pourrait avoir besoin de quelque chose comme:

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

Autres exemples: ActiveRecord :: Validations :: ClassMethods

116
DigitalRoss

Vous pouvez également utiliser ce format:

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

Ou puisque vos min et max sont identiques, ce qui suit fonctionnera également:

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

À partir de validates_length_of documentation :

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

:allow_blank - L'attribut peut être vide; ignorer la validation.

9
Gareth

Ou encore plus concis (avec la nouvelle syntaxe de hachage), à ​​partir du valide la documentation :

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

La limite supérieure devrait probablement représenter quelque chose de plus significatif, comme "in: 5..20", mais répondant simplement à la question.

8
Fellow Stranger

chaque validates_ * accepte: si ou: sauf les options

validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition

où validate_foo_condition est une méthode qui renvoie true ou false

vous pouvez également passer un objet Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
3
keymone

Que diriez-vous de cela: validates_length_of :foo, is: 3, allow_blank: true

2
shem
validates_length_of :reason, minimum: 3, maximum: 30

rspec pour le même est 

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

Ajoutez dans votre modèle:

validates :color, length: { is: 7 }

la couleur est une chaîne:

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