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?
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
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
À 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.
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.
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?}
Que diriez-vous de cela: validates_length_of :foo, is: 3, allow_blank: true
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) }
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