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?
Cette syntaxe effectuera la validation de l'inclusion tout en autorisant nils:
validates :kind, :inclusion => { :in => ['a', 'b'] }, :allow_nil => true
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
vérifiez également: allow_blank => true
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 }
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.