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?

Jawaban:



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

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.


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


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

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

2

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


-1

Tambahkan model Anda:

validates :color, length: { is: 7 }

warna adalah string:

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

-4

Dalam model Anda misalnya

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.