I am working on an invoice tracking system for my business and have gotten so close to getting this portion to work! I have an Invoice model with many InvoiceItems. I am following this example (which is based off of ryan daigle''s post) http://transfs.com/devblog/2009/06/26/nested-forms-with-rails-2-3-helpers-and-javascript-tricks/ and I''ve looked at a couple of other similar examples as well. I can generate the fields just fine, but when I try to add more fields and save, I get the following message: ActiveRecord::UnknownAttributeError in InvoicesController#update unknown attribute: invoice_items Parameters: {"commit"=>"Submit", "invoice"=>{"invoice_items_attributes"=>{"1248641854778"=> {"invoice_items"=>{"project_id"=>"9", "_delete"=>"0", "amount_billed"=>"48"}}, "0"=>{"project_id"=>"8", "_delete"=>"0", "id"=>"29", "amount_billed"=>"32.00"}}, "date_due(1i)"=>"2009", "date_due(2i)"=>"8", "date_due(3i)"=>"9"}, "client_id"=>"1", "_method"=>"put", "authenticity_token"=>"WiwqytxYy/KZSrO76kWKGCH2hMlgiCj1lSedQV3h6KA=", "id"=>"17"} The second line of parameters looks like it goes one level too deep with the Hash key "invoice_items". If you go further down to where the project_id is 8, that is the record that was already in existance. Below is the yaml output of the request. Here is the same request converted to yaml: --- !map:HashWithIndifferentAccess commit: Submit invoice: !map:HashWithIndifferentAccess invoice_items_attributes: !map:HashWithIndifferentAccess "1248641854778": !map:HashWithIndifferentAccess invoice_items: !map:HashWithIndifferentAccess project_id: "9" _delete: "0" amount_billed: "48" "0": !map:HashWithIndifferentAccess project_id: "8" _delete: "0" id: "29" amount_billed: "32.00" date_due(1i): "2009" date_due(2i): "8" date_due(3i): "9" authenticity_token: WiwqytxYy/KZSrO76kWKGCH2hMlgiCj1lSedQV3h6KA_method: put client_id: "1" action: update id: "17" controller: invoices My form basically looks like this: <% form_for [@client, @invoice], setup_invoice(@invoice) do |f| %> <%= f.error_messages %> <h2>Add Projects:</h2> <ul id="invoice_items"> <li class="invoice_item"> <% f.fields_for :invoice_items do |invoice_item| %> <%= invoice_item.collection_select :project_id, @client.projects, :id, :title, { :include_blank => true } %> <%= invoice_item.label :amount_billed, "Amount to bill" %> <%= invoice_item.text_field :amount_billed %> <% if invoice_item.object.new_record? %> <%= link_to_function "clear", "this.up(''.invoice_item'').remove ()" %> <% else %> <%= invoice_item.check_box ''_delete'' %> <%= invoice_item.label ''_delete'', ''Remove'' %> <% end %> <% end %> </li> </ul> <%= link_to_new_nested_form "Add a Project", f, :invoice_items %> <hr /> <p> <%= f.label :date_due %><br /> <%= f.date_select :date_due, :default => 15.days.from_now, :order => [:day, :month, :year], :start_year => Time.now.year %> </p> <p><%= f.submit "Submit" %></p> <% end %> I''m just not sure how to change the code to make it work! Here is what I have in my application_helper.rb: def generate_html(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] ||= :f form_builder.fields_for(method, options[:object], :child_index => ''NEW_RECORD'') do |f| render(:partial => options[:partial], :locals => { options [:form_builder_local] => f }) end end def link_to_new_nested_form(name, 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] ||= :f options[:element_id] ||= method.to_s options[:position] ||= :bottom link_to_function name do |page| html = generate_html(form_builder, method, :object => options[:object], :partial => options[:partial], :form_builder_local => options [:form_builder_local] ) page << %{ $(''#{options[:element_id]}'').insert({ #{options [:position]}: "#{ escape_javascript html }".replace(/NEW_RECORD/g, new Date().getTime()) }); } end end I''ve had other problems with this approach as well, but if I can at least get it to save to the db I should be okay.
Three things I can offer advice on here. You seem to be like me in you post a lot of information.. So, first post all that code on pastie.org or gisthub so it''s ordered nicely and easy to view. Then, post the link back here. Second, you ran a <%= debug(params) %> in your view to verify all parameters? Third, your field does exist in the table you are querying? If all those checks out, I''ll see if i can see anything on your new view code. Four eyes are better than 2. :) -- Posted via http://www.ruby-forum.com/.
First of all, thanks for taking the time to recommend a better way of displaying my problem! Here is the gist http://gist.github.com/155971 The problem arises when I use the helper method in my application_helper.rb to create new fields for the nested form. In my controller I build one instance of the invoice_item (@invoice.invoice_items.build) and that field works just fine, when viewing the parameters, it is the section that reads: "0": !map:HashWithIndifferentAccess project_id: "8" _delete: "0" id: "31" amount_billed: "32.00" It is the one above (in the params from the gist) that that looks similar (project_id: 9, amount_billed: "68") that is the problem, it is getting nested too deep under "invoice_items"…unnecessarily so it would seem. I have added my Invoice and InvoiceItems models to the gist as well. Thanks for your help! On Jul 26, 3:10 pm, Alpha Blue <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Three things I can offer advice on here. You seem to be like me in you > post a lot of information.. > > So, first post all that code on pastie.org or gisthub so it''s ordered > nicely and easy to view. Then, post the link back here. > > Second, you ran a <%= debug(params) %> in your view to verify all > parameters? > > Third, your field does exist in the table you are querying? > > If all those checks out, I''ll see if i can see anything on your new view > code. Four eyes are better than 2. :) > -- > Posted viahttp://www.ruby-forum.com/.
Hi Matt, Well the code checks out fine from my end with regards to syntax. However, I have a question in regards to your invoice.. Are you saving anything at all before the new nested instance is created? The reason I ask is because you are using :child_index and I was just curious whether you would run into issues with unused instances, or perhaps the issue is somewhere in that piece? Other than that, I just don''t know mate.. -- Posted via http://www.ruby-forum.com/.
I''m not saving anything before the new nested instance is created. I didn''t write the piece using :child_index, but perhaps I should do some more research about that chunk of code. Thanks again for your help, I''ll try to post the solution when I find it! On Jul 26, 6:17 pm, Alpha Blue <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Hi Matt, > > Well the code checks out fine from my end with regards to syntax. > However, I have a question in regards to your invoice.. > > Are you saving anything at all before the new nested instance is > created? The reason I ask is because you are using :child_index and I > was just curious whether you would run into issues with unused > instances, or perhaps the issue is somewhere in that piece? > > Other than that, I just don''t know mate.. > -- > Posted viahttp://www.ruby-forum.com/.
Yet another stupid mistake. I wasn''t keeping track of my partials and I had nested my nested form, thus creating the extra level of params. Sheesh On Jul 26, 8:14 pm, "Matt W." <m...-9Ukl6dVN2u9BDgjK7y7TUQ@public.gmane.org> wrote:> I''m not saving anything before the new nested instance is created. I > didn''t write the piece using :child_index, but perhaps I should do > some more research about that chunk of code. Thanks again for your > help, I''ll try to post the solution when I find it! > > On Jul 26, 6:17 pm, Alpha Blue <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> > wrote: > > > > > Hi Matt, > > > Well the code checks out fine from my end with regards to syntax. > > However, I have a question in regards to your invoice.. > > > Are you saving anything at all before the new nested instance is > > created? The reason I ask is because you are using :child_index and I > > was just curious whether you would run into issues with unused > > instances, or perhaps the issue is somewhere in that piece? > > > Other than that, I just don''t know mate.. > > -- > > Posted viahttp://www.ruby-forum.com/.