validator validations validates_presence_of validates rails method greater_than custom create ruby-on-rails validation models

ruby-on-rails - validations - rails validates if



Rieles: cómo requerir que al menos un campo no esté en blanco (5)

Agrega un método de validate a tu modelo:

def validate if field1.blank? and field2.blank? and field3.blank? # ... errors.add_to_base("You must fill in at least one field") end end

Sé que puedo requerir un campo agregando validates_presence_of :field al modelo. Sin embargo, ¿cómo exijo que al menos un campo sea obligatorio, mientras que no requiera ningún campo en particular?

gracias por adelantado

- Deb


Aquí hay una versión reutilizable:

class AnyPresenceValidator < ActiveModel::Validator def validate(record) unless options[:fields].any?{|attr| record[attr].present?} record.errors.add(:base, :blank) end end end

Puedes usarlo en tu modelo con:

validates_with AnyPresenceValidator, fields: %w(field1 field2 field3)


Creo que algo como lo siguiente puede funcionar

class MyModel < ActiveRecord::Base validate do |my_model| my_model.my_validation end def my_validation errors.add_to_base("Your error message") if self.blank? #or self.attributes.blank? - not sure end end


Puedes usar:

validate :any_present? def any_present? if %w(field1 field2 field3).all?{|attr| self[attr].blank?} errors.add :base, "Error message" end end

EDITAR: actualizado de la respuesta original para Rails 3+ según el comentario.

Pero tienes que proporcionar los nombres de campo manualmente. Podría obtener todas las columnas de contenido de un modelo con Model.content_columns.map(&:name) , pero incluirá las columnas created_at y updated_at también, y probablemente no sea lo que desea.


Yendo más allá con la respuesta correcta de @ Votya, aquí hay una forma de recuperar todas las columnas además de created_at y updated_at (y, opcionalmente, cualquier otra que desee eliminar):

# Get all column names as an array and reject the ones we don''t want Model.content_columns.map(&:name).reject {|i| i =~ /(created|updated)_at/}

Por ejemplo:

1.9.3p327 :012 > Client.content_columns.map(&:name).reject {|i| i =~ /(created|updated)_at/} => ["primary_email", "name"]