Reputation: 12653
In a Rails app I have several integer attributes on a model.
A user should be able to create a record and leave these attributes blank.
Or, if the user enters values for these attributes, they should be validated for numericality and within a certain range.
In the model I have something like this
validates_presence_of :name
validates_numericality_of :a, :only_integer => true, :message => "can only be whole number."
validates_inclusion_of :a, :in => 1..999, :message => "can only be between 1 and 999."
If I now test with the minimum required attributes to save:
factory :model do
sequence(:name) { |n| "model#{n}" }
end
it "should save with minium attributes" do
@model = FactoryGirl.build(:model)
@model.save.should == false
end
I get
Validation failed: a can only be whole number., a can only be between 1 and 999.
How can I validate numericality and inclusion only if a value is given for :a
, while still allowing :a
to be nil in some cases?
Thanks
Upvotes: 16
Views: 15064
Reputation: 34774
You can add an :allow_nil => true
to your validates_numericality_of
.
validates_numericality_of :a, :only_integer => true, :allow_nil => true,
:message => "can only be whole number."
You can also use greater_than_or_equal_to
and less_than_or_equal_to
options if you just want to use one validation:
validates_numericality_of :a, :only_integer => true, :allow_nil => true,
:greater_than_or_equal_to => 1,
:less_than_or_equal_to => 999,
:message => "can only be whole number between 1 and 999."
Upvotes: 31
Reputation: 5651
should be simply:
validates_numericality_of :a, :only_integer => true, :message => "can only be whole number.", :allow_nil => true
same for the second validation
Upvotes: 3