Rails: ฉันจะตรวจสอบได้อย่างไรว่าบางสิ่งเป็นบูลีน


115

รางมีตัวตรวจสอบความถูกต้องเหมือนvalidates_numericality_ofบูลีนหรือไม่หรือต้องม้วนเอง?

คำตอบ:


244

ตั้งแต่ Rails 3 คุณสามารถทำ:

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

2
ดังนั้นสิ่งนี้จะได้รับการตรวจสอบความถูกต้อง แต่ข้อความแสดงข้อผิดพลาดไม่เป็นประโยชน์สำหรับผู้ใช้: "myfield ไม่รวมอยู่ในรายการ"
Peter Sankauskas

2
จุดดี. คุณสามารถปรับแต่งข้อความแสดงข้อผิดพลาด: guide.rubyonrails.org/…
Drew Dara-Abrams

55
แบบสั้นvalidates :field, inclusion: [true, false]
แทบไม่รู้จัก

8
โปรดทราบว่าคุณไม่สามารถตรวจสอบความถูกต้องตามปกติสำหรับการแสดงตน ( validates :field, presence: true) สำหรับฟิลด์บูลีนได้ (ฟิลด์นี้ไม่สามารถใช้ได้กับfalseค่า) แต่ทั้งใน Rails 3 และ 4 validates :field, inclusion: [true, false]จะต้องทำการทดสอบเพื่อรวมไว้ในรายการค่าโดยมีผลข้างเคียงเพื่อทดสอบการมีอยู่ของฟิลด์ (เว้นแต่จะมีค่าใดค่าnilหนึ่งแน่นอน)
Martin Carel

1
และสำหรับผู้ที่ต้องการข้อความแสดงข้อผิดพลาด:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism

38

ฉันเชื่อว่าสำหรับฟิลด์บูลีนคุณจะต้องทำสิ่งต่างๆเช่น:

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

จากAPIเวอร์ชันเก่า: "นี่เป็นเพราะวิธีที่ Object # blank จัดการกับค่าบูลีน false.blank? # => true"

ฉันไม่แน่ใจว่านี่จะยังใช้ได้ดีสำหรับ Rails 3 หรือเปล่าหวังว่าจะช่วยได้!


lol @ Rails 3 ฉันพนันได้เลยว่านี่จะเป็นข้อแม้สำหรับเดือนต่อ ๆ ไป โอเคฉันคิดว่าการย้ายข้อมูลนี้เป็นไปแล้วและคุณเห็นด้วย ขอบคุณ!
aarona

เป็นเรื่องจริงสำหรับ Rails 4! ว้าวเท็จเปล่า? # => จริงดูเหมือนคำตอบที่ผิดสิ่งที่ฉันไม่คาดคิดจาก Rails
Dan Barron

1
ไม่ได้ผลเนื่องจากสตริงใด ๆ เช่น "foo" จะถูกแปลงเป็นtrueไฟล์.
กะหมอก

10

เมื่อฉันใช้สิ่งนี้ฉันจะได้รับ:

คำเตือนจากผู้จับคู่ควร:

คุณกำลังใช้validate_inclusion_ofเพื่อยืนยันว่าคอลัมน์บูลีนอนุญาตค่าบูลีนและไม่อนุญาตค่าที่ไม่ใช่บูลีน โปรดทราบว่าไม่สามารถทดสอบสิ่งนี้ได้ทั้งหมดเนื่องจากคอลัมน์บูลีนจะแปลงค่าที่ไม่ใช่บูลีนเป็นค่าบูลีนโดยอัตโนมัติ ดังนั้นคุณควรพิจารณาลบการทดสอบนี้


สำหรับฟิลด์ที่อนุญาตให้เป็นโมฆะมันยังคงแปลงศูนย์เป็นบูลีนหรือไม่
mwfearnley

เพียงลบการทดสอบนั้นออกยกเว้นว่าคอลัมน์เป็นโมฆะคุณควรทำสิ่งนี้: {should allow_value (nil) .for (: field)} Reference
Ardi Nusawan

4

คุณสามารถใช้เวอร์ชันที่สั้นกว่าได้:

validates :field, inclusion: [true, false]

ความคิดพิเศษ เมื่อจัดการกับ enums ฉันชอบใช้ค่าคงที่เช่นกัน:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

ตอบตามRails Docs 5.2.3

ตัวช่วยนี้ (การแสดงตน) ตรวจสอบว่าแอตทริบิวต์ที่ระบุไม่ว่างเปล่า มันใช้ช่องว่าง? วิธีตรวจสอบว่าค่าเป็นศูนย์หรือสตริงว่างนั่นคือสตริงที่ว่างเปล่าหรือประกอบด้วยช่องว่าง

ตั้งแต่ false.blank? เป็นจริงหากคุณต้องการตรวจสอบการมีอยู่ของฟิลด์บูลีนคุณควรใช้การตรวจสอบความถูกต้องอย่างใดอย่างหนึ่งต่อไปนี้:

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

นี่เป็นคำตอบเดียวกับข้อก่อนหน้านี้ยกเว้นเอกสารที่อัปเดตสะท้อนให้เห็นว่าแฮชจรวดไม่จำเป็นอีกต่อไป +1
aarona
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.