Suggested amendment to nested model forms documentation

I've noticed a couple of people tripping up (myself included) on using
the new nested model forms across has_one relationships. Because
@parentModel.childModel returns nil (as opposed to [] for a has_many
relationship) it is not possible to assign attributes to a new child
model in a has_one relationship without running
@parentModel.build_childModel first.

I've explained the exact error and the solution in more detail here :

http://www.pixellatedvisions.com/2009/03/18/rails-2-3-nested-model-forms-and-nil-new-record

Would it be possible to amend the rails guides and the documentation
on the rails blog on nested model forms to clarify this extra step
which is required for has_one relationships? The documentation as it
stands gives the impression that has_many and has_one are
interchangeable without any modification to your nested form code.
Just a simple note on this extra build_ step could save users a lot of
head scratching.

Cheers

Anton

P.S The complex_form_examples were invaluable in helping me track down
where I was going wrong in this instance. These are a great idea for
when you are having problems getting your own code to work and you
need a working example. Thank you to those responsible!

http://guides.rubyonrails.org/contribute.html has the low-down on getting on to the docrails project. Then you can fix the guides and documentation yourself. Since you've hit the issue and come up with the explanation, you're probably the best one to do the work.

Mike

Hi,

I've found that issue to be annoying as well, you either need to clutter
your controller with build statements or do something like this:

<% f.fields_for :address, @project.address.find_or_initialize %>..

I don't like either of these solutions and would personally prefer the
nested form helpers to initialize a new record transparently for the
purposes of the form.

I can create a ticket with patch if you like the idea.

Cheers

Pascal

Hi Anton,

Yes, this will definitely be addressed in a guide I'm working on.

There's also a ticket about adding a better fallback in the case you
are using fields_for for a nil association:
http://rails.lighthouseapp.com/projects/8994/tickets/2172-nested-model-forms-error-on-loading-data-from-one-to-one-associations-that-evaluate-to-nil

Cheers,
Eloy

How could I miss that ticket?

Thanks, let's continue the discussion there.

Best,
Pascal

I should have known you guys would be on the case already ;o)

In future I'll make a point of searching the lighthouse tickets first.
In the meantime I'll follow Mike's advice and try and put a note on
the rails guides release notes to warn users of this potential
pitfall.

Cheers

Anton

I've added a short explanation to the Rails 2.3 release notes :

http://github.com/lifo/docrails/commit/3d3a74f07fe192cddeb6084e15f16fa08c451499

I don't think it's a good idea to encourage people to build models in their views. You should probably tell them to build the association in the controller.

Manfred

Well, either way my edit got pulled from the release notes as they
want to keep those static.

As for where the building is happening - I just copied the technique
used in the complex forms examples as I assumed that was the reference
implementation. You're probably right and this should go in the
controller really seeing as it's manipulating models.