web-dev-qa-db-fra.com

rails validation:: allow_nil et: inclusion les deux nécessaires en même temps

Habituellement, le champ "type" doit être laissé vide. mais s'il n'est pas vide, la valeur doit être incluse dans ['a', 'b']

validates_inclusion_of :kind, :in => ['a', 'b'], :allow_nil => true

Le code ne fonctionne pas?

39
Daniel

Cette syntaxe effectuera la validation de l'inclusion tout en autorisant nils:

validates :kind, :inclusion => { :in => ['a', 'b'] }, :allow_nil => true
37
Matt

Dans Rails 5, vous pouvez utiliser allow_blank: true À l'extérieur ou à l'intérieur du bloc d'inclusion:

validates :kind, inclusion: { in: ['a', 'b'], allow_blank: true }

ou

validates :kind, inclusion: { in: ['a', 'b'] }, allow_blank: true

astuce: vous pouvez utiliser in: %w(a b) pour les valeurs de texte

29
vasylmeister

vérifiez également: allow_blank => true

9
Oren

Si vous essayez d'y parvenir dans Rails 5 dans un belongs_to association, considérez que le comportement par défaut nécessite que la valeur existe.

Pour désactiver ce comportement, vous devez spécifier l'indicateur optional:

belongs_to :foo, optional: true 

validates :foo, inclusion: { in: ['foo', 'bar'], allow_blank: true } 
2
Fabrizio Regini

Dans Rails 5.x, vous devez, en plus de la ligne suivante, appeler un before_validation méthode:

validates_inclusion_of :kind, :in => ['a', 'b'], :allow_nil => true

Le before_validation est nécessaire pour convertir la valeur vide soumise en nil, sinon '' n'est pas considéré comme nil, comme ceci:

  before_validation(on: [:create, :update]) do
    self.kind = nil if self.kind == ''
  end

Pour l'utilisation de l'espace disque de la base de données, il est bien sûr préférable de stocker les nil que de stocker des valeurs vides sous forme de chaînes vides.

0
W.M.