To validate a numerical value that should fall within a specific range, the numericality
validation helper provides us with options such as :greater_than_or_equal_to
and
:less_than_or_equal_to
or, :greater_than
and
:less_than
.
This is easy to understand as we know what kind of validation is expected just by reading the expressive option names.
But wouldn’t it be great if there was a way that could help save some key strokes while at the same time not compromise on the simplicity and expressiveness of the code?
In the
latest update to Rails,
this has been addressed.
We can now use the in:
option that accepts a range of values we wish to validate against.
We have always used ranges in Ruby. This is what a range looks like -
range = (1..5)
range.each { |n| puts n } # => 1, 2, 3, 4, 5
So, let’s say for profile details, we want a user to input their age and we want it to be between 18 and 65.
Before
The way to achieve this would have been,
class User < ApplicationRecord
validates :age, numericality: { greater_than_or_equal_to: 18, less_than_or_equal_to: 65 }
end
After
Now, the same can be achieved using the in:
option like so,
class User < ApplicationRecord
validates :age, numericality: { in: 18..65 }
end
When we try to add a User with an age
value that does not fall in between 18
and
65
, this is what we get -
User.create!(name: "Chris", age: 14)
# => ActiveRecord::RecordInvalid (Validation failed: Age must be greater than or equal to 18)