Thanks pankaj88, that worked nicely.
On Oct 17, 11:46 pm, pankaj88 <[email protected]> wrote:
> Hi Ryan,
>
> The problem is you have't actually passed the house id to the room
> because
> <p>House id is <%= @house.id %></p>
>
> just displays the house id to that page. But it won't be submitted
> with the form
> If I am getting right you have a relationship in house model like
> has_many :rooms
>
> ok
> Let me explain that to get the house id in controller the house.id
> must be submitted to the controller
> You can do this by two ways
>
> 1. Submitting house.id via hidden field
> use <%= hidden_field :house_id%>
>
> Note to get this running it must be set when building new room object
> build using
> @house.rooms.build() OR
> Room.new(:house_id => @house.id)
>
> If this one didn't work contact me at
> [email protected] or
>
> blog.railsjaipur.in
>
> I'll tell you a second solution.
>
> On Oct 18, 4:15 am, ryan8720 <[email protected]> wrote:
>
> > I have a rails application that models a house. house contains rooms
> > and rooms have nested attributes for light and small_appliance. I have
> > a calculator controller, which is how end users will access the
> > application.
>
> > My problem is that I can't get the partial for adding rooms to submit
> > correctly from calculator. The initial page lets the user enter house
> > information, which is saved using save_house when submit is clicked.
> > This also redirects the user to the add_rooms page, where they can add
> > rooms to the house.
>
> > add_rooms displays correctly, but when I click submit, I get this
> > error:
>
> > -------------------------------
>
> > RuntimeError in Calculator#add_room
>
> > Showing app/views/calculator/add_rooms.html.erb where line #2 raised:
>
> > Called id for nil, which would mistakenly be 4 -- if you really wanted
> > the id of nil, use object_id
>
> > Extracted source (around line #2):
>
> > 1: <div id="addRooms">
> > 2: <p>House id is <%= @house.id %></p>
> > 3:
> > 4: <h3>Your rooms:</h3>
> > 5: <% if @house.rooms %>
>
> > RAILS_ROOT: C:/Users/ryan/Downloads/react
> > Application Trace | Framework Trace | Full Trace
>
> > C:/Users/ryan/Downloads/react/app/views/calculator/add_rooms.html.erb:
> > 2:in `_run_erb_app47views47calculator47add_rooms46html46erb'
> > C:/Users/ryan/Downloads/react/app/controllers/calculator_controller.rb:
> > 36:in `add_room'
> > C:/Users/ryan/Downloads/react/app/controllers/calculator_controller.rb:
> > 33:in `add_room'
>
> > -------------------------------
>
> > This is odd to me, because when add_rooms first renders, it shows the
> > house_id. I don't understand why it isn't passed after the form is
> > submitted.
>
> > Here's the code:
>
> > -------------------------------
>
> > #app/models/room.rb
>
> > class Room < ActiveRecord::Base
> > # schema { name:string, house_id:integer }
> > 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
>
> > def save_house
> > @house = House.new(params[:house])
> > respond_to do |format|
> > if @house.save
> > format.html { render :action => 'add_rooms', :id => @house }
> > format.xml { render :xml => @house, :status
> > => :created, :location => @house }
> > else
> > format.html { render :action => 'index' }
> > format.xml { render :xml => @house.errors, :status
> > => :unprocessable_entity }
> > end
> > end
> > end
>
> > def add_rooms
> > @house = House.find(params[:id])
> > @rooms = Room.find_by_house_id(@house.id)
>
> > rescue ActiveRecord::RecordNotFound
> > logger.error("Attempt to access invalid house #{params[:id]}")
> > flash[:notice] = "You must create a house before adding rooms"
> > redirect_to :action => 'index'
> > end
>
> > def add_room
> > @room = Room.new(params[:room])
> > @house = @room.house
>
> > respond_to do |format|
> > if @room.save
> > flash[:notice] = "Room \"#[email protected]}\" was successfully
> > added."
> > format.html { render :action => 'add_rooms' }
> > format.xml { render :xml => @room, :status
> > => :created, :location => @room }
> > else
> > format.html { render :action => 'add_rooms' }
> > format.xml { render :xml => @room.errors, :status
> > => :unprocessable_entity }
> > end
> > end
> > rescue ActiveRecord::RecordNotFound
> > logger.error("Attempt to access invalid house #{params[:id]}")
> > flash[:notice] = "You must create a house before adding a room"
> > redirect_to :action => 'index'
> > end
>
> > def report
> > flash[:notice] = nil
> > @house = House.find(params[:id])
> > @rooms = Room.find_by_house_id(@house.id)
> > 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
>
> > <div id="addRooms">
> > <p>House id is <%= @house.id %></p>
>
> > <h3>Your rooms:</h3>
> > <% if @house.rooms %>
> > <ul>
> > <% for room in @house.rooms %>
> > <li>
> > <%= h room.name %> has <%= h room.number_of_bulbs %>
> > <%= h room.wattage_of_bulbs %> watt bulbs, in use for
> > <%= h room.usage_hours %> hours per day.
> > </li>
> > <% end %>
> > </ul>
> > <% else %>
> > <p>You have not added any rooms yet</p>
> > <% end %>
>
> > <%= render :partial => 'rooms/room_form' %>
>
> > <br />
> > </div>
>
> > <%= button_to "Continue to report", :action => "report", :id => @house
> > %>
>
> > -------------------------------
>
> > #app/views/rooms/_room_form.html.erb
>
> > <% form_for :room, @house.rooms.build, :url => { :action
> > => :add_room } do |form| %>
> > <%= form.error_messages %>
> > <p>
> > <%= form.label :name %><br />
> > <%= form.text_field :name %>
> > </p>
>
> > <h3>Lights</h3>
> > <% form.object.lights.build if form.object.lights.empty? %>
> > <% form.fields_for :lights do |light_form| %>
> > <%= render :partial => "light", :locals => { :form => light_form }
> > %>
> > <% end %>
> > <p class="addLink"><%= add_child_link "[+] Add new light",
> > form, :lights %></p>
>
> > <h3>Small Appliances</h3>
> > <% form.object.small_appliances.build if
> > form.object.small_appliances.empty? %>
> > <% form.fields_for :small_appliances do |sm_appl_form| %>
> > <%= render :partial => "small_appliance", :locals => { :form =>
> > sm_appl_form } %>
> > <% end %>
> > <p class="addLink"><%= add_child_link "[+] Add new small appliance",
> > form, :small_appliances %></p>
>
> > <p><%= form.submit "Submit" %></p>
> > <% end %>
>
> > -------------------------------
>
> > #application_helper.rb
>
> > module ApplicationHelper
> > def remove_child_link(name, form)
> > form.hidden_field(:_delete) + link_to_function(name, "remove_fields
> > (this)")
> > end
>
> > def add_child_link(name, form, method)
> > fields = new_child_fields(form, method)
> > link_to_function(name, h("insert_fields(this, \"#{method}\", \"#
> > {escape_javascript(fields)}\")"))
> > end
>
> > def new_child_fields(form_builder, method, options = {})
> > options[:object] ||=
> > form_builder.object.class.reflect_on_association(method).klass.new
> > options[:partial] ||= method.to_s.singularize
> > options[:form_builder_local] ||= :form
> > form_builder.fields_for(method, options[:object], :child_index =>
> > "new_#{method}") do |form|
> > render(:partial => options[:partial], :locals => { options
> > [:form_builder_local] => form })
> > end
> > end
> > end
>
> > -------------------------------
>
> > Thanks,
> > Ryan
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---