Validation order when mixing callbacks and validates_format

I posted this question the other day, but it was pretty late so I think
I wrote a bunch of gibberish. So let me try it now that I’ve been
properly doused with caffeine. :slight_smile:

The Problem: I’m using the “before_validation” callback to modify an
attribute value on a particular model object before it gets validated.
I’m also using “validates_format_of” to do error checking on that same
model attribute. If “before_validation” doesn’t happen before
“validates_format_of”, Rails blows up.

Looking in my AWDWR book, it looks like when you call model.save(),
there is an order to validation:

before_validation

after_validation

before_save
before_create / before_update
INSERT / UPDATE OPERATION

However, when I try to create a new model object, it looks like
before_validation does not get called before “validates_format_of”. My
assumption would be that the “validates_” helpers should before after
“before_validation”, but this doesn’t seem to be correct.

Can anyone help me out with this? When does “validates_format_of” get
called in relation to “before_validation”?

Thanks,
kodama

Can you post your before_validation code?

What actually blows up? Can you also post the relevant lines from the
log?

brewpoo wrote:

Can you post your before_validation code?

What actually blows up? Can you also post the relevant lines from the
log?

I am having this same problem. It seems the before_validation isn’t
working in mine:

before_validation :normalize_phone_number

validates_format_of     :number,       :with => /^[0-9]{10,15}$/

protected

def normalize_phone_number
  self.number.gsub(/-/,"").gsub(/ /,"")
end

The object won’t save since it fails the validates_format_of since it
never runs the before_validation. I’m running Rails 2.1.0.

Any ideas?

I just figured out what I was doing wrong.

I was using “gsub” instead of “gsub!”

now it is working fine

I’m having the same problem. I want to allow people to enter a value
including a $ or £. With this method, the value of the attribute in
before_validation is zero if I enter a value with text (or a $) at the
start.

So entering $1000 is turned into 0, before before_validation.

Any ideas?

Marli Ba wrote:

brewpoo wrote:

Can you post your before_validation code?

What actually blows up? Can you also post the relevant lines from the
log?

I am having this same problem. It seems the before_validation isn’t
working in mine:

before_validation :normalize_phone_number

validates_format_of     :number,       :with => /^[0-9]{10,15}$/

protected

def normalize_phone_number
  self.number.gsub(/-/,"").gsub(/ /,"")
end

The object won’t save since it fails the validates_format_of since it
never runs the before_validation. I’m running Rails 2.1.0.

Any ideas?