Rails: Validating min and max length of a string but allowing it to be blank

Ruby on-RailsRubyValidationModel

Ruby 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbgadociView Question on Stackoverflow
Solution 1 - Ruby on-RailsquainjnView Answer on Stackoverflow
Solution 2 - Ruby on-RailsDigitalRossView Answer on Stackoverflow
Solution 3 - Ruby on-RailsFellow StrangerView Answer on Stackoverflow
Solution 4 - Ruby on-RailsGarethView Answer on Stackoverflow
Solution 5 - Ruby on-RailskeymoneView Answer on Stackoverflow
Solution 6 - Ruby on-Railsshiva kumarView Answer on Stackoverflow
Solution 7 - Ruby on-RailsshemView Answer on Stackoverflow
Solution 8 - Ruby on-RailsMarlon Henry SchweigertView Answer on Stackoverflow
Solution 9 - Ruby on-RailscodevoiceView Answer on Stackoverflow