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"]