Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails - Using form_for and fields_for, how do you access the sub-object while in the fields_for block?

In my first rails app I'm trying to use form_for and fields_for to create a nested object form. So far so good, but I can't figure out how to access the sub-object while in the fields_for block. I've pre-populated a field in the sub-object with data that I want to show in the user instructions.

Models
Garage:

has_many :cars, :dependent => :destroy          accepts_nested_attributes_for :cars 

Car:

belongs_to :garage 

Garage Controller

def new   @garage = Garage.new   for i in 1..5      @garage.cars.build :stall_number => i   end end 

_form.html.erb

<%= form_for @garage do |f| %>   <%= f.label :title, "Garage Name" %><br />   <%= f.text_field :title %>   <% f.fields_for :cars do |builder| %>     <p>Enter license for car parked in stall: <%= car.stall_number %></p>     <%= f.label :license, "License #:" %><br />     <%= f.text_field :license %>   <%= end %> <%= end %> 

As you can see, inside the builder block for :cars, I want to show, in my user instructions, the field: car.stall_number (populated in my controller with an integer):

<p>Enter license for car parked in stall: <%= car.stall_number%></p> 

I've tried a many different ideas: @car.stall_number, object.car.stall_number, etc. No joy. Multiple searches and a look at the fields_for source code haven't helped my understanding. I would appreciate any guidance.

Update: For clarification, per Dan's suggestion I have tried builder.stall_number but it results in a

NoMethodError: undefined method 'stall_number' for #<ActionView::Helpers::FormBuilder:0x00000102a1baf0> 
like image 469
Don Leatham Avatar asked Feb 18 '11 06:02

Don Leatham


1 Answers

I just dealt with this today myself.

You can access the object of the fields_for through:

builder.object 

where builder is your fields_for form builder object. In your particular case, you can say:

<p>Enter license for car parked in stall: <%= builder.object.stall_number%></p> 

That should do it for you!

like image 90
CharlieMezak Avatar answered Sep 23 '22 02:09

CharlieMezak