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/portable 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 trop comment faire cela.
validates_presence_of :mobile_number, :unless => :home_phone.blank?
J'utilise Rails 3.
Vous n'avez pas besoin d'un lambda. Cela fera:
validates_presence_of :mobile_number, :unless => :home_phone?
De plus, tous les validateurs prennent la même chose si/sauf les options, vous pouvez donc les rendre conditionnelles à volonté.
Mise à jour: En regardant cette réponse quelques jours plus tard, je vois que je devrais expliquer pourquoi cela fonctionne:
:unless
du validateur en tant que symbole, Rails recherchera une méthode d'instance portant ce nom, l'invoquera sur l'instance en cours de validation (au moment de la validation) et n'effectuera la validation que si la méthode renvoie false.home_phone
dans la table de votre modèle force Rails à créer une méthode pratique #home_phone?
. Cette méthode retourne true si et seulement si home_phone est présent (c'est-à-dire non vide). Si l'attribut home_phone est nil ou s'il s'agit d'une chaîne vide ou d'un espace vide, home_phone? retournera faux.UPDATE: Confirmation que cette ancienne technique continue de fonctionner dans Rails 5.
Vous devez utiliser un objet lambda
/Proc
:
validates_presence_of :mobile_number, :unless => lambda { self.home_phone.blank? }
À partir de Rails 4, vous pouvez passer un bloc à la présence. En résumé:
validates :mobile_number, presence: {unless: :home_phone?}
De plus, :home_phone?
renvoie false pour nil ou vide.
Voici une autre manière qui fonctionne dans Rails 4
validates_presence_of :job, if: :executed_at?
validates :code,
presence: true,
length: { minimum: 10, maximum: 50 },
uniqueness: { case_sensitive: false },
numericality: { only_integer: true }
une solution courte:
validates_presence_of :mobile_number, unless: -> { home_phone.blank? }