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

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?



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