Tip: Nested attributes need a reload before you can trust them

I hit on a solution (probably well known by others) that needs
repeating so it can be found by Google next time :sunglasses:

I am using Ryan B.’ nested_form Gem, which works perfectly to
create rich nested forms with extra JavaScript goodies like “Add
another [nested object]”. In my controller’s update method, I was
testing to see if the result of the update had left a Title with no
“primary” Person, using this bit of logic:

if((@title.roles.length > 0) && !@title.roles.include?( @title.role ))
@title.update_attributes(:role_id => @title.roles.first.id)

I put this block after the @title.update_attributes(params[:title])
call, and spent most of the afternoon chasing my tail to figure out
why it never was working. A puts @title.roles.inspect showed that the
list of roles apparently hadn’t been changed by the call to
update_attributes, even though the following page load (to the view
method) showed the correct data had been persisted.

This morning, I added the line


before the block, and all started working perfectly. So word to the
wise, reload before you start asking questions!