ruby-on-rails - validations - rails validates if
Validación de la longitud mínima y máxima de una cadena, pero permitiendo que esté en blanco (8)
¿Qué tal eso: validates_length_of :foo, is: 3, allow_blank: true
Tengo un campo que me gustaría validar. Quiero que el campo se deje en blanco, pero si un usuario está ingresando datos, quiero que esté en un formato determinado. Actualmente estoy usando las validaciones a continuación en el modelo, pero esto no permite que el usuario lo deje en blanco:
validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
¿Cómo escribo esto para lograr mi objetivo?
Creo que podría necesitar algo como:
validates_length_of :foo, :minimum => 5, :maximum => 5, :allow_blank => true
Más ejemplos: ActiveRecord::Validations::ClassMethods
De la documentación validates_length_of :
validates_length_of :phone, :in => 7..32, :allow_blank => true
:allow_blank
- El atributo puede estar en blanco; saltar validación
En su modelo, por ejemplo
def validate
errors.add_to_base ''error message'' unless self.foo.length == 5 or self.foo.blanc?
end
O incluso más conciso (con la nueva sintaxis hash), de la documentación validada :
validates :foo, length: 5..5, allow_blank: true
El límite superior probablemente debería representar algo más significativo, como "en: 5.20", pero simplemente responder la pregunta al pie de la letra.
También puedes usar este formato:
validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true
O bien, dado que su mínimo y máximo son los mismos, lo siguiente también funcionará:
validates :foo, length: {is: 5}, allow_blank: true
cada validates_ * acepta: if o: al menos opciones
validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition
donde validate_foo_condition es un método que devuelve verdadero o falso
también puede pasar un objeto Proc:
validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
validates_length_of :reason, minimum: 3, maximum: 30
rspec para el mismo es
it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }