简体   繁体   中英

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

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."

should be simply:

validates_numericality_of :a, :only_integer => true, :message => "can only be whole number.", :allow_nil => true

same for the second validation

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM