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.