Rails: Validating min and max length of a string but allowing it to be blank
Ruby on-RailsRubyValidationModelRuby on-Rails Problem Overview
I have a field that I would like to validate. I want the field to be able to be left blank, but if a user is entering data I want it to be in a certain format. Currently I am using the below validations in the model, but this doesn't allow the user to leave it blank:
validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
How do I write this to accomplish my goal?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
You can also use this format:
validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true
Or since your min and max are the same, the following will also work:
validates :foo, length: {is: 5}, allow_blank: true
Solution 2 - Ruby on-Rails
I think it might need something like:
validates_length_of :foo, minimum: 5, maximum: 5, allow_blank: true
More examples: ActiveRecord::Validations::ClassMethods
Solution 3 - Ruby on-Rails
Or even more concise (with the new hash syntax), from the http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates">validates documentation:
validates :foo, length: 5..5, allow_blank: true
The upper limit should probably represent somehting more meaningful like "in: 5..20", but just answering the question to the letter.
Solution 4 - Ruby on-Rails
From the validates_length_of documentation:
validates_length_of :phone, :in => 7..32, :allow_blank => true
> :allow_blank
- Attribute may be blank; skip validation.
Solution 5 - Ruby on-Rails
every validates_* accepts :if or :unless options
validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition
where validate_foo_condition is method that returns true or false
you can also pass a Proc object:
validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
Solution 6 - Ruby on-Rails
validates_length_of :reason, minimum: 3, maximum: 30
rspec for the same is
it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
Solution 7 - Ruby on-Rails
How about that:
validates_length_of :foo, is: 3, allow_blank: true
Solution 8 - Ruby on-Rails
Add in your model:
validates :color, length: { is: 7 }
color is a string:
t.string :color, null: false, default: '#0093FF', limit: 7
Solution 9 - Ruby on-Rails
In your model e.g.
def validate
errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end