70 votes

Valider la présence du champ uniquement si un autre champ est vide - Rails

J'ai un formulaire avec un numéro de portable / cellulaire et un numéro de téléphone à la maison.

Je souhaite que la présence du numéro de portable / cellulaire ne soit validée que si le numéro de téléphone a été laissé en blanc ou inversement.

Mes validations actuelles pour ces champs sont les suivantes.

 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 je ne savais pas comment faire cela exactement.

 validates_presence_of :mobile_number, :unless => :home_phone.blank?
 

J'utilise Rails 3.

136voto

Rob Davis Points 7639

Vous n'avez pas besoin d'un lambda. Cela va faire:

validates_presence_of :mobile_number, :unless => :home_phone?

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:

  • Si vous définissez un programme de validation de l' :unless option pour être un symbole, Rails de chercher une méthode d'instance de ce nom, et de l'envoyer à l'instance en cours de validation, et seulement effectuer la validation si la méthode renvoie false.
  • ActiveRecord crée automatiquement le point d'interrogation méthodes pour chacun de vos attributs du modèle, de sorte que l'existence d'un home_phone colonne dans votre modèle de table causes Rails pour créer un handy #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.

benzado dit cela (voir les commentaires): "TOUTEFOIS, dans certaines circonstances, ces validations peuvent être mis en place avant, rails génère la méthode d'aide et votre application peut ne pas démarrer. Il est donc plus sûr de placer l'appel dans un lambda."

23voto

Ryan Bigg Points 64561

Vous devez utiliser un objet lambda / Proc :

 validates_presence_of :mobile_number, :unless => lambda { self.home_phone.blank? }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X