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