Andy Harvey
Andy Harvey

Reputation: 12653

How to validate numericality and inclusion while still allowing attribute to be nil in some cases?

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

Answers (2)

Shadwell
Shadwell

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

thorsten müller
thorsten müller

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

Related Questions