Validar la longitud mínima y máxima de una cadena pero permitiendo que esté en blanco


Tengo un campo que me gustaría validar. Quiero que el campo se pueda dejar en blanco, pero si un usuario está ingresando datos, quiero que esté en un formato determinado. Actualmente estoy usando las siguientes validaciones 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?

Author: bgadoci, 2010-12-14

9 answers

Creo que podría necesitar algo como:

validates_length_of :foo, :minimum => 5, :maximum => 5, :allow_blank => true

Más ejemplos: ActiveRecord::Validations:: ClassMethods

 111
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-01 10:24:08

También puedes usar este formato:

validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true

O como su mínimo y máximo son los mismos, lo siguiente también funcionará:

validates :foo, length: {is: 5}, allow_blank: true
 99
Author: quainjn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-21 20:47:48

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; omitir validación.

 9
Author: Gareth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-14 17:19:35

O aún más conciso (con la nueva sintaxis hash), desde el valida la documentación :

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 respondiendo a la pregunta al pie de la letra.

 6
Author: Fellow Stranger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-05 18:29:00

Cada validates_ * acepta :if o: unless options

validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition

Donde validate_foo_condition es el método que devuelve true o false

También puede pasar un objeto Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
 3
Author: keymone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-14 17:21:13

¿Qué tal eso: validates_length_of :foo, is: 3, allow_blank: true

 2
Author: shem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-07 12:52:39
validates_length_of :reason, minimum: 3, maximum: 30

Rspec para lo mismo es

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
 1
Author: shiva kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-03 19:42:08

Añadir en su modelo:

validates :color, length: { is: 7 }

El color es una cadena:

t.string :color, null: false, default: '#0093FF', limit: 7
 0
Author: Marlon Henry Schweigert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 14:18:10

En su modelo, por ejemplo,

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
 -4
Author: codevoice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-14 17:35:10