Validations and Transactions

Hey I have a rather complex record set with lots of associated models
all being save by 1 form. So I've wrapped the whole thing in a
transaction block, but, does anyone know how I can get Active Record
to return my validation errors?

Hey Cammo,

This may not be straight forward and it depends on how your transaction
is setup. If you are creating the objects during the transaction,
it will only process the entities until it fails, potentially leaving
some objects uninstantiated.

AR errors are attached to the AR instance when it is checked for
validation. So save, create, valid? calls will all run through
the validation steps of a model and attach any errors that were found
to that instance.

ie.

@my_model.valid? #=> will attach the errors to the @my_model instance.

You get these with a number of methods

@my_model.errors

or in a view

error_messages_for ‘my_model’

If you want to get all the objects to return their errors you might use
something like this in your controller. (sorry can’t check syntax
here )

def create

@my_objects = list_of_object_params.map{ |obj_p| MyModel.new( obj_p ) }

MyObject.transaction do

@my_objects.each{ |obj| obj.save! }

end

rescue

#There is an issue in the transaction here.

@my_objects.each{ |obj| obj.valid? } #=> ensure validation is run on all objects

render / redirect / whatever

end

then in your view

<% @my_objects.each do |obj| %>

<% @tmp = obj %>

<%= error_messages_for ‘tmp’ %>

<% end %>

This may not work, it’s not very elegant, and I’ve never tried it
before :wink: But it may give you some clues to move forward.

Cheers

Daniel

Yeah cool. It's kinda a shortcoming of transactions, I can see why it
works that way, but it seems a little stupid.

Thanks again, I'll investigate.