Rails: Bir şeyin boole olduğunu nasıl doğrularım?


115

Rayların validates_numericality_ofboole için olduğu gibi bir doğrulayıcı var mı yoksa kendiminkini döndürmem gerekiyor mu?

Yanıtlar:


244

Rails 3'ten bu yana şunları yapabilirsiniz:

validates :field, inclusion: { in: [ true, false ] }

2
Dolayısıyla, bu doğrulamayı doğru yapar, ancak hata mesajı son kullanıcı için yararlı değildir: "alanım listede yer
almıyor

2
İyi bir nokta. Hata mesajını özelleştirebilirsiniz: guides.rubyonrails.org/…
Drew Dara-Abrams

55
Daha kısa biçimvalidates :field, inclusion: [true, false]
zar zor biliniyor

8
validates :field, presence: trueBir boole alanı için mevcudiyet ( ) için olağan doğrulamaya sahip olamayacağınızı unutmayın (alan bir falsedeğer için geçerli olmayacaktır ). Ancak hem Rails 3 hem de 4'te, validates :field, inclusion: [true, false]alanın varlığını test etmek için yan etki ile bir değerler listesine dahil edilmeyi test etmek gerekir (bu değerlerden biri nilelbette değilse ).
Martin Carel

1
Ve ona bir hata mesajıyla ihtiyaç duyanlar için:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism

38

Boole alanı için aşağıdaki gibi bir şey yapmanız gerektiğine inanıyorum:

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

API'nin eski bir sürümünden : "Bu, Object # blank'in boole değerlerini işleme biçiminden kaynaklanmaktadır. False.blank? # => True"

Bunun Rails 3 için hala iyi olup olmayacağından emin değilim, umarım yardımcı olur!


lol @ Rails 3. Bunun önümüzdeki aylar için bir uyarı olacağına bahse girerim. Tamam, bu migth'in bu olduğunu sanıyordum ve siz de kabul ediyorsunuz Teşekkürler!
aarona

Rails 4 için doğru! Vay be, false.blank? # => true sadece yanlış cevap gibi görünüyor , Rails'den beklemediğim bir şey.
Dan Barron

1
Bu, herhangi bir dizge, örneğin "foo" 'ya dönüştürüleceği için çalışmaz true.
Ka Mok

10

Bunu uyguladığımda şunu elde ederim:

Shoulda-eşleştiricilerden uyarı:

validate_inclusion_ofBir boole sütununun boole değerlerine izin verdiğini ve boolean olmayanlara izin vermediğini iddia etmek için kullanıyorsunuz . Boolean sütunlar otomatik olarak boole olmayan değerleri boolean değerlere dönüştüğünden, bunu tam olarak test etmenin mümkün olmadığını unutmayın. Bu nedenle, bu testi kaldırmayı düşünmelisiniz.


Null değerine izin verilen alanlar için, yine de nil'i boolean'a dönüştürüyor mu?
mwfearnley

Sütun boş değer atanabilirse bunu yapmanız dışında, bu testi kaldırın: {allow_value (nil) .for (: field)} Reference
Ardi Nusawan

4

Daha kısa versiyonu kullanabilirsiniz:

validates :field, inclusion: [true, false]

Ekstra düşünce. Numaralandırmalarla uğraşırken ben de bir sabit kullanmayı severim:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Göre cevapla Rails Docs 5.2.3'e

Bu yardımcı (varlık), belirtilen özniteliklerin boş olmadığını doğrular. Boşluk kullanıyor mu? değerin sıfır mı yoksa boş bir dize mi, yani boş veya boşluklardan oluşan bir dize mi olduğunu kontrol etme yöntemi.

False.blank'tan beri? doğrudur, bir boole alanının varlığını doğrulamak istiyorsanız, aşağıdaki doğrulamalardan birini kullanmalısınız:

validates :boolean_field_name, inclusion: { in: [true, false] }

Bu, güncellenmiş belgeler haricinde bir öncekiyle aynı cevap, hash roketlerinin artık gerekli olmadığı gerçeğini yansıtıyor. +1.
aarona
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.