Rails: Validation de la longueur minimale et maximale d'une chaîne mais lui permettant d'être vide

87

J'ai un champ que je voudrais valider. Je veux que le champ puisse être laissé vide, mais si un utilisateur entre des données, je veux qu'elles soient dans un certain format. Actuellement, j'utilise 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 écrire ceci pour atteindre mon objectif?

bgadoci
la source

Réponses:

135

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

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

Plus d'exemples: ActiveRecord :: Validations :: ClassMethods

DigitalRoss
la source
7
pour une taille spécifique, vous pouvez utiliser la contrainte de longueur: is
GuiGreg
130

Vous pouvez également utiliser ce format:

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

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

validates :foo, length: {is: 5}, allow_blank: true
quainjn
la source
11

Ou encore plus concis (avec la nouvelle syntaxe de hachage), de la documentation des validates :

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 à la lettre.

Fellow étranger
la source
Dans Don't think infonctionnera avec des chaînes, semble être uniquement des nombres
ecoologic
1
Cela devrait fonctionner à la place validates :foo, length: 2..5, allow_blank: truemais `length: {is: 5}` ferait l'affaire dans le cas de l'OP
PhilT
3

every validates_ * accepte: if ou: sauf options

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

où validate_foo_condition est une méthode qui renvoie vrai ou faux

vous pouvez également passer un objet Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
keymone
la source
2
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) }
Shiva Kumar
la source
2

Et à propos de ça: validates_length_of :foo, is: 3, allow_blank: true

shem
la source
-1

Ajoutez votre modèle:

validates :color, length: { is: 7 }

la couleur est une chaîne:

t.string :color, null: false, default: '#0093FF', limit: 7
Marlon Henry Schweigert
la source
-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
codevoice
la source