Render partials with nested attributes from another model

Hi everyone,

My previous question was posted
herehttp://groups.google.com/group/rubyonrails-talk/browse_thread/thread/dddaeb075789d4b5.
I’m starting a new topic as the problems have shifted.

I have a rails application that models a house. There is a house model
that
has_many rooms. A room has a house_id and a name. I’ve also used the
complex-form-examples http://github.com/ryanb/complex-form-examples to
give room nested attributes of lights and small_appliances.
complex-form-examples uses RJS and partials to accomplish this.

There is a controller called calculator that is what users will use to
access the application. When the submit button on calculator is
pressed, it
saves house information and redirects to an add_rooms page (located in
app/views/calculator/add_rooms.html.erb) where the user can add rooms to
the
house. The add_rooms page uses a partial from
app/views/rooms/_room_form.html.erb. I can get this page to display by
removing the add_child_link links. If I don’t remove them, I get this
error:

Showing app/views/rooms/_room_form.html.erb where line #13 raised:

undefined method `reflect_on_association’ for NilClass:Class

With add_child_link gone the page renders. However, when I click submit
I
get a new error message:

ActiveRecord::AssociationTypeMismatch in CalculatorController#add_room

C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/associations/association_collection.rb:320:in
each' C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2740:in attributes=’
C:/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:2438:in
initialize' C:/Users/ryan/Downloads/react/app/controllers/calculator_controller.rb:31:in new’
C:/Users/ryan/Downloads/react/app/controllers/calculator_controller.rb:31:in
`add_room’

If I remove the small_application part, the same thing happens for
light. I
think it has something to do with accepts_nested_attributes_for in the
room
model.

I need to get this page working so that rooms can be added to a house
without using the scaffold built pages. Users won’t have access to
those.
I also need the house id to be saved as house_id in the rooms table.

Here is the code:

app/models/room.rb

class Room < ActiveRecord::Base
  belongs_to :house
  has_many :lights, :dependent => :destroy
  has_many :small_appliances, :dependent => :destroy
  validates_presence_of :name
  accepts_nested_attributes_for :lights, :reject_if => lambda { |a|

a.values.all?(&:blank?) }, :allow_destroy => true
accepts_nested_attributes_for :small_appliances, :reject_if => lambda
{ |a| a.values.all?(&:blank?) }, :allow_destroy => true
end

app/models/house.rb

class House < ActiveRecord::Base
  has_many :rooms

  # validation code not included

  def add_room(room)
    rooms << room
  end

end

app/controllers/calculator_controller.rb

class CalculatorController < ApplicationController
  def index
  end
  # save_house is called when submit is
  # pressed in app/views/calculator/index.html.erb
  def save_house
      end
    redirect_to :action => 'index'
        flash[:notice] = "Room \"#[email protected]}\" was successfully
  rescue ActiveRecord::RecordNotFound
    logger.error("Attempt to access invalid house #{params[:id]}")
    flash[:notice] = "You must create a house before generating a

report"
redirect_to :action => ‘index’
end

end

app/views/calculator/add_rooms.html.erb

      <%= h room.usage_hours %> hours per day.
  <%= button_to "Continue to report", :action => "report", :id =>

@house %>

app/views/rooms/_room_form.html.erb

<% form_for :room, :url => { :action => :add_room, :id => @house } 

do

light_form } %>
form, :small_appliances %>

  <p><%= form.submit "Submit" %></p>
<% end %>

application_helper.rb

module ApplicationHelper
  end
end

public/javascripts/application.js

function insert_fields(link, method, content) {

hidden_field.value = '1';

}
$(link).up(“.fields”).hide();
}

Thanks,
Ryan