tutorial rails que ejemplos curso caracteristicas aprender ruby-on-rails ruby-on-rails-3

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? }