Valider la présence de champ uniquement si un autre champ est vide - Rails
J'ai un formulaire avec un mobile/nombre de cellules et un numéro de téléphone à domicile.
Je veux avoir seulement de valider la présence de mobile/cellulaire numéro si le numéro de téléphone a été laissée en blanc ou vice versa.
Mes validations de ces champs sont comme suit.
validates_presence_of :mobile_number
validates_presence_of :home_phone
validates_length_of :home_phone, :minimum => 12, :maximum => 12
validates_length_of :mobile_number, :minimum => 10, :maximum => 10, :allow_blank => true
validates_format_of :home_phone, :with => /\A[0-9]{2}\s[0-9]{4}\s[0-9]{4}/, :message => "format should be 02 9999 9999"
Je pensais que je pouvais avoir quelque chose comme ce qui suit, mais ne savez pas comment faire exactement.
validates_presence_of :mobile_number, :unless => :home_phone.blank?
Je suis à l'aide de Rails 3.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'un lambda. Cela va faire:
Aussi, tous les validateurs de prendre les mêmes si/moins d'options, de sorte que vous pouvez les faire conditionnelle à volonté.
Mise à jour: en Regardant en arrière à cette réponse quelques jours plus tard, je vois que je devrais expliquer pourquoi cela fonctionne:
:unless
option pour être un symbole, Rails de chercher une méthode d'instance de ce nom, appeler cette méthode sur l'instance en cours de validation -- au moment de la validation -- et seulement effectuer la validation si la méthode renvoie false.home_phone
colonne dans votre modèle de table causes Rails pour créer une pratique#home_phone?
méthode. Cette méthode retourne true si et seulement si home_phone est présent (c'est à dire pas vide). Si le home_phone attribut est nul ou une chaîne vide ou un groupe de blancs d'espace, home_phone? retourne la valeur false.Mise à JOUR: Confirmé que cette technique ancienne continue à travailler dans les Rails 5.
:unless => :home_phone?
, et ma théorie est que la méthode de recherche qui se passait trop vite.Vous devez utiliser un
lambda
/Proc
objet:home_phone
peut renvoyer une chaîne vide, ce qui je pense que serait faire la validation passer de toute façon. Le booléen je pense que seuls les chèques pournil
.home_phone?
(avec un point d'interrogation) est fausse si lahome_phone
attribut est vide (nil ou une chaîne vide). Je me demande si Paul accidentellement laissé le point d'interrogation. Qui serait critique.validates_presence_of :string_value, unless: lambda {self.integer_value.present? || self.decimal_value.present?}
(ne peut pas mettre de code approprié dans le commentaire). Voici les lignes qui ne sont pas:validates_presence_of :string_value, unless: :integer_value? || :decimal_value?
etvalidates_presence_of :string_value, unless: (:integer_value? || :decimal_value?)
unless
paramètre s'attend à un symbole, comme:integer_value?
Il ne prend pas une expression booléenne comme ça. Pour une expression que vous voulez être évaluée au moment de la validation, vous aurez besoin d'un lambda, mais c'est différent de la situation dans le post original.De départ dans les Rails 4, vous pouvez passer d'un bloc à la présence. De manière concise:
Aussi,
:home_phone?
renvoie la valeur false pour le néant ou le vide.Voici une autre manière des œuvres dans les rails 4
un court de solution: