Rails: Memvalidasi panjang min dan max string tetapi membiarkannya kosong

88

Saya memiliki bidang yang ingin saya validasi. Saya ingin kolom tersebut dapat dikosongkan, tetapi jika pengguna memasukkan data, saya ingin dalam format tertentu. Saat ini saya menggunakan validasi di bawah ini dalam model, tetapi ini tidak mengizinkan pengguna untuk membiarkannya kosong:

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

Bagaimana saya menulis ini untuk mencapai tujuan saya?

bgadoci.dll
sumber

Jawaban:

135

Saya pikir itu mungkin membutuhkan sesuatu seperti:

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

Contoh lainnya: ActiveRecord :: Validations :: ClassMethods

DigitalRoss
sumber
7
untuk ukuran tertentu Anda dapat menggunakan batasan panjang: is
GuiGreg
133

Anda juga dapat menggunakan format ini:

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

Atau karena min dan max Anda sama, berikut ini juga akan berfungsi:

validates :foo, length: {is: 5}, allow_blank: true
quainjn
sumber
12

Atau bahkan lebih ringkas (dengan sintaks hash baru), dari dokumentasi validasi :

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

Batas atas mungkin harus mewakili sesuatu yang lebih berarti seperti "dalam: 5..20", tetapi hanya menjawab pertanyaan ke surat itu.

Fellow Stranger
sumber
Dalam tidak berpikir inakan bekerja dengan string, tampaknya hanya angka
ekologi
1
Ini seharusnya berfungsi validates :foo, length: 2..5, allow_blank: truetetapi `length: {is: 5}` akan dilakukan dalam kasus OP
PhilT
11

Dari dokumentasi validates_length_of :

validates_length_of :phone, :in => 7..32, :allow_blank => true

:allow_blank- Atribut boleh kosong; lewati validasi.

Gareth
sumber
3

setiap validates_ * menerima: jika atau: kecuali opsi

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

di mana validate_foo_condition adalah metode yang mengembalikan benar atau salah

Anda juga dapat mengirimkan objek Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
keymone
sumber
2
validates_length_of :reason, minimum: 3, maximum: 30

rspec untuk hal yang sama adalah

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
shiva kumar
sumber
2

Bagaimana tentang itu: validates_length_of :foo, is: 3, allow_blank: true

shem
sumber
-1

Tambahkan model Anda:

validates :color, length: { is: 7 }

warna adalah string:

t.string :color, null: false, default: '#0093FF', limit: 7
Marlon Henry Schweigert
sumber
-4

Dalam model Anda misalnya

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
codevoice
sumber