ruby on rails - rails - Valide la presencia del campo solo si otro campo está en blanco: rieles
ruby on rails que es (5)
Aquí hay otra manera que funciona en rieles 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 }
Tengo un formulario con un número de móvil / celular y un número de teléfono particular.
Solo quiero tener que validar la presencia del número de móvil / celular si el número de teléfono se ha dejado en blanco o viceversa.
Mis validaciones actuales para estos campos son las siguientes.
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"
Pensé que podría tener algo como lo siguiente pero no estoy seguro de cómo hacer esto exactamente.
validates_presence_of :mobile_number, :unless => :home_phone.blank?
Estoy usando Rails 3.
Comenzando en Rails 4, puedes pasar un bloque a presencia. Concisamente:
validates :mobile_number, presence: {unless: :home_phone?}
Además, :home_phone?
devuelve falso por cero o en blanco.
Debe usar un objeto lambda
/ Proc
:
validates_presence_of :mobile_number, :unless => lambda { self.home_phone.blank? }
No necesitas una lambda. Esto lo hara:
validates_presence_of :mobile_number, :unless => :home_phone?
Además, todos los validadores toman las mismas opciones if / unless, por lo que puede hacer que sean condicionales a voluntad.
Actualización: Mirando hacia atrás en esta respuesta unos días más tarde, veo que debería explicar por qué funciona:
- Si establece la validación de
:unless
opción sea un símbolo, Rails buscará un método de instancia de ese nombre, invocará ese método en la instancia que se está validando, en el momento de la validación, y solo realizará la validación si el método devuelve falso . - ActiveRecord crea automáticamente métodos de interrogación para cada uno de los atributos de su modelo, por lo que la existencia de una columna
home_phone
en la tabla de su modelo hace que Rails cree un práctico#home_phone?
método. Este método devuelve verdadero si y solo si home_phone está presente (es decir, no está en blanco). Si el atributo home_phone es nulo o una cadena vacía o un montón de espacio en blanco, home_phone? devolverá falso.
ACTUALIZACIÓN: Confirmó que esta técnica antigua sigue funcionando en Rails 5.
una solución corta:
validates_presence_of :mobile_number, unless: -> { home_phone.blank? }