Rails: bagaimana cara memvalidasi bahwa sesuatu itu boolean?

115

Apakah rel memiliki validator seperti validates_numericality_ofuntuk boolean atau apakah saya perlu menggulungnya sendiri?

aarona
sumber

Jawaban:

244

Sejak Rails 3, Anda dapat melakukan:

validates :field, inclusion: { in: [ true, false ] }
Drew Dara-Abrams
sumber
2
Jadi, ini mendapatkan validasi yang benar, tetapi pesan kesalahan tidak membantu untuk pengguna akhir: "myfield tidak termasuk dalam daftar"
Peter Sankauskas
2
Poin yang bagus. Anda dapat menyesuaikan pesan kesalahan: panduan.rubyonrails.org/…
Drew Dara-Abrams
55
Bentuk lebih pendekvalidates :field, inclusion: [true, false]
hampir tidak diketahui
8
Perhatikan bahwa Anda tidak dapat memiliki validasi biasa untuk keberadaan ( validates :field, presence: true) untuk bidang boolean (bidang tidak akan valid untuk suatu falsenilai). Tapi di Rails 3 dan 4, setelah validates :field, inclusion: [true, false]akan menguji penyertaan dalam daftar nilai, dengan efek samping untuk menguji keberadaan bidang (kecuali salah satu dari nilai-nilai itu niltentu saja).
Martin Carel
1
Dan bagi mereka yang membutuhkannya dengan pesan kesalahan:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism
38

Saya percaya untuk bidang boolean Anda perlu melakukan sesuatu seperti:

validates_inclusion_of :field_name, :in => [true, false]

Dari versi lama API : "Ini karena cara Object # blank? Menangani nilai boolean. False.blank? # => True"

Saya tidak yakin apakah ini masih akan baik-baik saja untuk Rails 3, harap itu membantu!

Budgie
sumber
lol @ Rails 3. Saya yakin ini akan menjadi peringatan selama berbulan-bulan mendatang. Oke, saya pikir migrasi ini berhasil dan Anda setuju. Terima kasih!
aarona
Itu benar untuk Rails 4! Wow, false.blank? # => true sepertinya jawaban yang salah , sesuatu yang tidak saya harapkan dari Rails.
Dan Barron
1
Ini tidak bekerja, karena setiap string misalnya, "foo" akan diubah menjadi true.
Ka Mok
10

Ketika saya menerapkan ini, saya mendapatkan:

Peringatan dari shoulda-matchers:

Anda menggunakan validate_inclusion_ofuntuk menegaskan bahwa kolom boolean mengizinkan nilai boolean dan tidak mengizinkan nilai non-boolean. Ketahuilah bahwa tidak mungkin untuk menguji ini sepenuhnya, karena kolom boolean akan secara otomatis mengonversi nilai non-boolean menjadi nilai boolean. Karenanya, Anda harus mempertimbangkan untuk menghapus tes ini.

pengguna708617
sumber
Untuk bidang di mana nol diperbolehkan, apakah itu masih mengubah nil menjadi boolean?
mwfearnley
Hapus saja tes itu, kecuali jika kolom nullable Anda harus melakukan ini: it {should allow_value (nil) .for (: field)} Referensi
Ardi Nusawan
4

Anda dapat menggunakan versi yang lebih pendek:

validates :field, inclusion: [true, false]

Pemikiran ekstra. Saat berurusan dengan enum, saya juga suka menggunakan konstanta:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS
Flavio Wuensche
sumber
2

Jawaban menurut Rails Docs 5.2.3

Helper ini (kehadiran) memvalidasi bahwa atribut yang ditentukan tidak kosong. Ini menggunakan kosong? metode untuk memeriksa apakah nilainya nihil atau string kosong, yaitu string yang kosong atau terdiri dari spasi.

Sejak false.blank? benar, jika Anda ingin memvalidasi keberadaan bidang boolean, Anda harus menggunakan salah satu validasi berikut:

validates :boolean_field_name, inclusion: { in: [true, false] }
Cody Elhard
sumber
Ini jawaban yang sama dengan yang sebelumnya kecuali dokumen yang diperbarui mencerminkan fakta bahwa roket hash tidak lagi diperlukan. +1.
aarona