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?

Réponses:



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


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.


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

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

2

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


-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

-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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.