La compréhension des Rails de validation: ce n'allow_blank faire?
Je suis assez nouveau pour les Rails et a trouvé un petit extrait pour valider la présence et de l'unicité étape par étape: tout d'abord vérifier la présence, puis vérifier l'unicité.
validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false }
Je suis un peu confus au sujet de l'aide presence => true
et allow_blank => true
ensemble.
Sans l'aide de allow_blank => true
à la fois les règles seront vérifiés en même temps et de ne pas, étape par étape.
Pourquoi ne allow_blank => true
réaliser ce tour de magie?
- dans le guide officiel il est dit ":allow_blank est ignoré par la présence du programme de validation." Peut-être cela peut vous aider.
- aussi jeter un oeil à cette grande réponse
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez est équivalent à ceci (retour à la ligne pour plus de clarté):
C'est un peu idiot, bien que depuis si vous êtes exigeant la présence, alors ça va "invalider" l' :allow_blank clause :l'unicité.
Il fait plus de sens lorsque vous basculez à l'aide d'autres validateurs.. disons... le format et le caractère unique, mais vous ne voulez pas tout vérifie s'il est vide. Dans ce cas, l'ajout d'un "appliquée dans le monde" :allow_blank fait plus de sens et SEC est un peu le code.
Ce...
peut être écrit comme:
allow_blank
etpresence
ensemble 🙂La distinction suivante peut être utile à savoir:
nil
est une valeur vide. Un test rapide sur Rails 5 me dit quenil
ne pas faillir à ma validation...allow_blank
option: github.com/rails/rails/blob/...presence
etallow_blank
travailler ensemble. Je me suis arrêté à l'aide de Rails de nombreuses années, sinon je le ferais moi-même. Je compte sur la communauté pour garder cette réponse jusqu'à ce jour et fiable.validates :columnx, presence: true, if: Proc.new{ |x| x.columnx.nil? }
, basé sur edgeguides.rubyonrails.org/...:allow_blank
est une option "désactiver" plusieurs validateurs, mais pas la présence du programme de validation. Le résultat de l'utilisation de ces deux ensemble, c'est que lorsque le champ est laissé vide, vous obtiendrez la:blank
message d'erreur (c'est à dire, "ne peut pas être vide"), mais pas les autres messages d'erreur.Dans votre code,
:presence =>
et:uniqueness =>
sont les validateurs, tandis que:allow_blank =>
est une option par défaut qui est transmis à d'autres validateurs.De sorte que votre code:
Est l'équivalent de ce code:
Cependant, la
presence
validateur ignore laallow_blank
option, de sorte que votre code finit par être essentiellement ceci:Avoir
:allow_blank => true
dans:uniqueness
signifie que lorsque l'email est vide, leuniqueness
de validation ne sera pas exécutée.Un effet de ceci est que vous éliminer de la base de données de la requête.
E. g., sans la
:allow_blank => true
condition de vous voir ce:Mais avec la
:allow_blank => true
option vous ne voyez pas queUser Exists
DB requête arriver.L'autre bord de cas d'effets secondaires qui se passe quand vous ont un enregistrement à un message e-mail vide dans votre base de données déjà. Dans ce cas, si vous ne pas ont la
:allow_blank => true
option sur launiqueness
validateur, vous verrez alors deux erreurs reviennent:Mais avec la
:allow_blank => true
option, vous ne pourrez voir que les"can't be blank"
d'erreur (en raison de l'unicité de validation ne fonctionne pas lorsque l'email est vide).donc, cela signifie que, lorsque nous utilisons
allow_blank
sur e-mail, si le message est nul, une seule erreur ajouté àerrors
objet, de sauter à l'unicité valide.Trop expliquer simplement faire des choses simples plus compliqué, disons simplement: