Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

accepts_nested_attributes_for bug?

#5337

I have a new model object
with accepts_nested_attributes_for to an associated model
When I go to the html form, the fields for those nested attributes are not rendered

But, if I have a model object where that associated model object is saved, the form is rendered with the correct data.

Is there anything I need to do to get the form fields for the nested attributes render when no data exists? Or is this method only for associated objects already created?

I've attached screenshots. 1 has data and renders the form, the other does not.

Models:

class Booking < ActiveRecord::Base
  has_one :event_address, :as => :addressee

  accepts_nested_attributes_for :event_address
end

class EventAddress < ActiveRecord::Base
  belongs_to :addressee, :polymorphic => true
end

Haml:

= form_for @booking, :url => booking_event_information_path(@booking) do |f|
  = f.error_messages
  
  = f.fields_for :event_address do |f2| 
    = f2.label :address_1, "Address"
    = f2.text_field :address_1
    %br
  
    = f2.label :address_2
    = f2.text_field :address_2
    %br
  
  = f.submit "Save event information"

Any help is much helpful :) Thanks.

Reported by Matt Simpson · August 9th, 2010 @ 05:59 AM

State: invalid
Milestone: none
Assigned to: nobody
Importance: Low

Activity

  1. kylc
    kylc

    Make sure that you're building the nested model in the controller before rendering the form:

    def new
      @booking = Booking.new
      @booking.addressee.build
    end
    

    August 9th, 2010 @ 09:03 PM

  2. Matt Simpson
    Matt Simpson
    • Tag changed from active record, activerecord associations, nested attributes, activerecord to active record, activerecord associations, nested attributes, rails 3.0.0.beta4, activerecord

    I'm terribly sorry, I forgot to mention this is in Rails 3:

    [msimpson@dakota Code] (master) $ ruby -v
    ruby 1.9.2dev (2010-07-02 revision 28524) [x86_64-darwin10.4.0]
    [msimpson@dakota Code] (master) $ rails -v
    Rails 3.0.0.beta4
    

    When I call the build method on the end of either @booking.event_address or @booking.addressee I get:

    NoMethodError (undefined method `build' for nil:NilClass):
      app/controllers/booking_controller.rb:17:in `event_information'
    

    Thanks

    August 10th, 2010 @ 04:38 AM

  3. Matt Simpson
    Matt Simpson

    However, looking further into the documentation (note that build is not in the method list) the correct usage is:

    @booking.build_event_information and doing so does render the form. Thank you, is this by design for the accepts_nested_attributes_for method? If I do not have accepts_nested_attributes_for set the fields do render, just not with the functionality needed. Perhaps this should be in the documentation for accepts_nested_attributes_for?

    Thank you for your help and direction.

    August 10th, 2010 @ 04:43 AM

  4. Rohit Arondekar
    Rohit Arondekar
    • Tag changed from active record, activerecord associations, nested attributes, rails 3.0.0.beta4, activerecord to active record, nested attributes, rails 3.0.0.beta4, activerecord, associations

    October 7th, 2010 @ 05:21 AM

  5. Aditya Sanghi
    Aditya Sanghi

    @matt, just chiming in here as a fellow user.

    Yes this is the intended functionality. When you are using accepts_nested_attributes_for, the association needs to be built before the form can be rendered. The method used for building does depend on the type of association you have (has_many or belongs_to etc) in the base model and is not really connected to the attribute_nested_for issue.

    If you do not use accepts_nested_attributes_for, the keys in received from the form params in your model differ to when you do use accepts_nested_attributes_for in your base model differ and you have to manually write the plumbing in your model (or elsewhere) to ensure the association is built and saved.

    Ryan has a set of Railscasts on Complex forms which explain the functionality very well. I think there is a Rails Guide on Nested form in progress which when released would serve as authoritative documentation on the feature.

    October 7th, 2010 @ 08:48 AM

  6. David Trasbo
    David Trasbo
    • State changed from new to invalid
    • Importance changed from to Low

    fields_for not rendering anything if no object(s) are built is the intended behavior.

    October 7th, 2010 @ 08:56 PM