Rails: làm cách nào để xác thực rằng một cái gì đó là boolean?


115

Đường ray có trình xác thực như validates_numericality_ofcho boolean hay tôi cần cuộn của riêng mình?

Câu trả lời:


244

Kể từ Rails 3, bạn có thể làm:

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

2
Vì vậy, đây được quyền xác nhận, nhưng thông báo lỗi là không hữu ích cho người dùng cuối: "myfield không được bao gồm trong danh sách"
Peter Sankauskas

2
Điểm tốt. Bạn có thể tùy chỉnh các thông báo lỗi: guides.rubyonrails.org/...
Drew Dara-Abrams

55
Hình thức ngắn hơnvalidates :field, inclusion: [true, false]
barelyknown

8
Lưu ý rằng bạn không thể có xác thực thông thường cho sự hiện diện ( validates :field, presence: true) cho trường boolean (trường sẽ không hợp lệ cho một falsegiá trị). Nhưng trong cả Rails 3 và 4, việc validates :field, inclusion: [true, false]kiểm tra để đưa vào danh sách các giá trị, với tác dụng phụ để kiểm tra sự hiện diện của trường (tất nhiên là trừ khi một trong những giá trị đó nil).
Martin Carel,

1
Và đối với những người cần nó với một thông báo lỗi:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism

38

Tôi tin rằng đối với trường boolean, bạn sẽ cần thực hiện một số việc như:

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

Từ phiên bản cũ hơn của API : "Điều này là do cách Object # blank? Xử lý các giá trị boolean. False.blank? # => True"

Tuy nhiên, tôi không chắc liệu điều này có còn ổn với Rails 3 hay không, hy vọng điều đó sẽ giúp ích!


lol @ Rails 3. Tôi có thể cá rằng đây sẽ là lời cảnh báo trong nhiều tháng tới. Ok, tôi nghĩ rằng migth này đã được và bạn đồng ý. Cảm ơn!
aarona,

Nó đúng với Rails 4! Chà, false.blank? # => true dường như là câu trả lời sai , điều mà tôi không mong đợi từ Rails.
Dan Barron

1
Điều này không hoạt động, vì bất kỳ chuỗi nào, ví dụ: "foo" sẽ được chuyển đổi thành true.
Ka Mok

10

Khi tôi áp dụng điều này, tôi nhận được:

Cảnh báo từ những người phối hợp nêna:

Bạn đang sử dụng validate_inclusion_ofđể khẳng định rằng một cột boolean cho phép các giá trị boolean và không cho phép các cột không boolean. Lưu ý rằng không thể kiểm tra hoàn toàn điều này, vì các cột boolean sẽ tự động chuyển đổi các giá trị không phải boolean thành giá trị boolean. Do đó, bạn nên xem xét loại bỏ thử nghiệm này.


Đối với các trường cho phép null, nó vẫn chuyển nil thành boolean?
mwfearnley 28/09/16

Chỉ cần xóa kiểm tra đó, ngoại trừ nếu cột có giá trị rỗng, bạn nên thực hiện điều này: nó {should allow_value (nil) .for (: field)} Tham khảo
Ardi Nusawan

4

Bạn có thể sử dụng phiên bản ngắn hơn:

validates :field, inclusion: [true, false]

Suy nghĩ thêm. Khi xử lý enums, tôi cũng thích sử dụng một hằng số:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Trả lời theo Rails Docs 5.2.3

Trình trợ giúp (sự hiện diện) này xác nhận rằng các thuộc tính được chỉ định không trống. Nó sử dụng chỗ trống? phương pháp để kiểm tra xem giá trị là nil hay chuỗi trống, nghĩa là một chuỗi trống hoặc bao gồm khoảng trắng.

Kể từ khi false.blank? là đúng, nếu bạn muốn xác thực sự hiện diện của trường boolean, bạn nên sử dụng một trong các cách xác nhận sau:

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

Đây là câu trả lời tương tự như câu trả lời trước ngoại trừ các tài liệu cập nhật phản ánh thực tế rằng tên lửa băm không còn cần thiết nữa. +1.
aarona
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.