2010-12-14 108 views
59

J'ai un champ que je souhaite valider. Je veux que le champ puisse être laissé vide, mais si un utilisateur entre des données je veux qu'il soit dans un certain format. Actuellement, je suis en utilisant les ci-dessous dans le modèle de validation, mais cela ne permet pas à l'utilisateur de laisser le champ vide:Valider la longueur min et max d'une chaîne mais en la laissant vide

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

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

Répondre

98

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

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

Autres exemples: ActiveRecord::Validations::ClassMethods

+3

pour une taille spécifique, vous pouvez utiliser la contrainte de longueur: est – GuiGreg

-4

Dans votre modèle par exemple

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

tous les validates_ * accepte: si ou: à moins d'options

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

où validate_foo_condition est la 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?} 
87

Vous pouvez également utiliser ce format:

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

Ou depuis votre min et max sont les mêmes, ce qui suit travaillera également:

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

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

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

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

+0

En ne pense pas que 'in' sera travailler avec des chaînes, semble être des nombres seulement – ecoologic

+1

Cela devrait fonctionner à la place 'validates: foo, longueur: 2..5, allow_blank: true' mais' longueur: {is: 5} 'ferait dans le cas de l'OP – PhilT

+0

@PhilT Thank vous, mise à jour réponse! –

1
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

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