Raylar: Bir dizenin minimum ve maksimum uzunluğunu doğrulamak, ancak boş olmasına izin vermek


88

Doğrulamak istediğim bir alanım var. Alanın boş bırakılmasını istiyorum, ancak bir kullanıcı veri giriyorsa, belirli bir formatta olmasını istiyorum. Şu anda modelde aşağıdaki doğrulamaları kullanıyorum, ancak bu kullanıcının boş bırakmasına izin vermiyor:

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

Hedefime ulaşmak için bunu nasıl yazabilirim?

Yanıtlar:



133

Bu biçimi de kullanabilirsiniz:

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

Veya minimum ve maksimum değerleriniz aynı olduğundan, aşağıdakiler de çalışacaktır:

validates :foo, length: {is: 5}, allow_blank: true

12

Doğrulayan belgelerden daha da kısa (yeni karma sözdizimiyle) :

validates :foo, length: 5..5, allow_blank: true

Üst sınır muhtemelen "in: 5..20" gibi daha anlamlı bir şeyi temsil etmeli, ancak sadece soruyu harfiyen yanıtlayarak.


Sanmıyorum indizelerle çalışacak, sadece rakamlar gibi görünüyor
ekolojik

1
Bunun yerine bu işe validates :foo, length: 2..5, allow_blank: true
yaramalı


3

her validates_ * şunu kabul eder: if veya: if options

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

burada validate_foo_condition, doğru veya yanlış döndüren yöntemdir

ayrıca bir Proc nesnesi de iletebilirsiniz:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}

2
validates_length_of :reason, minimum: 3, maximum: 30

aynı şey için rspec

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }

2

Peki ya bu: validates_length_of :foo, is: 3, allow_blank: true


-1

Modelinize ekleyin:

validates :color, length: { is: 7 }

renk bir dizedir:

t.string :color, null: false, default: '#0093FF', limit: 7

-4

Modelinizde örneğin

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.