Rails doesn't come with a built-in boolean validator.
That means if we have boolean attribute and we set it to nil
, it defaults to false
, which is not necessarily what we want.
For example a SchrodingersCat
model with a alive
boolean attribute:
cat = SchrodingersCat.new(alive: nil) cat.valid? # => true
To solve that problem we can add a custom validator:
# app/validators/boolean_validator.rb class BooleanValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) return if value.in? [false, true] record.errors.add attribute, :boolean end end
Then we can use that validator the same way as the built-in ones:
# app/models/schrodingers_cat.rb class SchrodingersCat < ApplicationRecord validates :alive, boolean: true end
The error message can be defined for example in activerecord.errors.messages.boolean
:
# config/locales/en.yml en: activerecord: errors: messages: boolean: "must be boolean"
The result:
cat = SchrodingersCat.new(alive: nil) cat.valid? # => false cat.errors.to_a # => ["Alive must be boolean"]
Top comments (0)