before_validation an before_validation_on_create

I'm not sure what's the difference between before_validation an
before_validation_on_create. Is it that before_validation gets invoked
before a create and update call, whereas the latter just gets invoked
on create call?

Yes, exactly. before_validation happens before every validation. That means:

model.valid?

model.save

model.create

before_validation_on_create only happens when saving a new record.

Andrew Vit wrote in post #1071395:

Yes, exactly. before_validation happens before every validation. That
means:

model.valid?
model.save
model.create

before_validation_on_create only happens when saving a new record.

How do these before validation callbacks work? Are they just simple
function callbacks, or can you return false or errors.add in them to
halt the rest of the record.save code?

Have a look at the Rails Guide on ActiveRecord Validations and
Callbacks. That may answer your questions.

Colin

Colin Law wrote in post #1071428:

How do these before validation callbacks work? Are they just simple
function callbacks, or can you return false or errors.add in them to
halt the rest of the record.save code?

Have a look at the Rails Guide on ActiveRecord Validations and
Callbacks. That may answer your questions.

Colin

Thanks for the pointer.

Here's the quick answer for future users, from RoR api:

"If the returning value of a before_validation callback can be evaluated
to false, the process will be aborted and Base#save will return false.
If ActiveRecord::Validations#save! is called it will raise a
ActiveRecord::RecordInvalid exception. Nothing will be appended to the
errors object.

...

If a before_* callback returns false, all the later callbacks and the
associated action are cancelled. If an after_* callback returns false,
all the later callbacks are cancelled. Callbacks are generally run in
the order they are defined, with the exception of callbacks defined as
methods on the model, which are called last."