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?
ruby-on-rails
ruby
validation
model
bgadoci
la source
la source
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
la source
À partir de la documentation validates_length_of :
validates_length_of :phone, :in => 7..32, :allow_blank => true
la source
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.
la source
in
fonctionnera avec des chaînes, semble être uniquement des nombresvalidates :foo, length: 2..5, allow_blank: true
mais `length: {is: 5}` ferait l'affaire dans le cas de l'OPevery 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?}
la source
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) }
la source
Et à propos de ça:
validates_length_of :foo, is: 3, allow_blank: true
la source
Ajoutez votre modèle:
validates :color, length: { is: 7 }
la couleur est une chaîne:
t.string :color, null: false, default: '#0093FF', limit: 7
la source
Dans votre modèle par exemple
def validate errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc? end
la source