Reputation: 37302
Does rails have a validator like validates_numericality_of
for boolean or do I need to roll my own?
Upvotes: 127
Views: 60619
Reputation: 675
Answer according to Rails Docs 5.2.3
This helper (presence) validates that the specified attributes are not empty. It uses the blank? method to check if the value is either nil or a blank string, that is, a string that is either empty or consists of whitespace.
Since false.blank? is true, if you want to validate the presence of a boolean field you should use one of the following validations:
validates :boolean_field_name, inclusion: { in: [true, false] }
Upvotes: 3
Reputation: 10346
You can use the shorter version:
validates :field, inclusion: [true, false]
Extra thought. When dealing with enums, I like to use a constant too:
KINDS = %w(opening appointment).freeze
enum kind: KINDS
validates :kind, inclusion: KINDS
Upvotes: 6
Reputation: 8054
Since Rails 3, you can do:
validates :field, inclusion: { in: [ true, false ] }
Upvotes: 264
Reputation: 196
When I apply this, I get:
Warning from shoulda-matchers:
You are using validate_inclusion_of
to assert that a boolean column
allows boolean values and disallows non-boolean ones. Be aware that it
is not possible to fully test this, as boolean columns will
automatically convert non-boolean values to boolean ones. Hence, you
should consider removing this test.
Upvotes: 15
Reputation: 2279
I believe for a boolean field you will need to do something like:
validates_inclusion_of :field_name, :in => [true, false]
From an older version of the API: "This is due to the way Object#blank? handles boolean values. false.blank? # => true"
I'm not sure if this will still be fine for Rails 3 though, hope that helped!
Upvotes: 43