This project is archived and is in readonly mode.

#756 ✓stale
Glenn Powell

Nested fields_for doesn't work when passed name of field

Reported by Glenn Powell | August 4th, 2008 @ 06:33 PM | in 2.x

I've been trying to get the FormBuilder variant of fields_for to work for a few weeks now, but I can't seem to find what I feel to be the correct solution, and I think there may be a bug preventing me from realizing my goal.

If I create a form for a model, where the controller has already set the instance variable:

@user = # (or current_user for an edit)

Then the view has (I'll leave out tags):

form_for :user, :url => user_url(@user), :html => { :method => :put, :multipart => true } do |f|

Now I add a nested model (Contact). And let's say that doesn't exist yet since we are in the 'new' controller.

Then the view would also have:

f.fields_for :contact do |cf|

  1. and then maybe...


However, when I do this, I receive the error:

`@user[contact]' is not allowed as an instance variable name

If, however, I instead explicitly create = in the, and then write the above fields_for like this:

f.fields_for do |cf|

Then everything works just fine. (I do have to create or I receive another error pertaining to 'user[nil_value]' not being valid)

The weird thing is, that I debugged a bit, and found that the object_name which is being passed to eventually give the error above is equal to 'user[contact]' in BOTH cases. So somehow, the instance variable name is only not allowed if the variable ( has not been instantiated?

This doesn't seem right. If there is in fact a way of doing this differently and correctly to make it work, then I feel that the documentation should be updated to include using FormBuilder.fields_for differently than the normal fields_for.

Comments and changes to this ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href=""></a>