Philip Nelson
2008-Apr-11 21:59 UTC
Problem with Multi-Level Partials and observe_field Updates
Folks, I''m building a complex data entry / edit screen (to a customer spec) and am having problems with part of it. I render a partial for line items in an order - <%= render :partial => ''order_product'', :collection => @order.order_products %> This partial contains a text box to enter a product code. When a code is entered and you tab away from it (onblur) then it has to look up the database for the product text. Here''s the partial code which does this - <td class="orders_code" width="30"> <% if order_product.new_record? %> <%= f.text_field :product_code, :size => 10, :value => '''', :onblur => ''setProductRowID(this);RecalculateOrder();'' %> <% else %> <%= f.text_field :product_code, :size => 10, :onblur => ''RecalculateOrder();'' %> <% end %> </td> <% product_code_field = numprefix + ''product_code'' if order_product.new_record? opid = '''' else opid = order_product.id.to_s end %> <%= observe_field product_code_field, :update => ''product_details'', :url => {:controller => ''orders'', :action => ''find_base_product'' }, :with => "''product_code=''+encodeURIComponent(value)+''&noe=#{new_or_existing}&pid=#{opid}''" %> <% if params[:action] == ''new'' p_c = '''' p_id = '''' else if new_or_existing == ''new'' p_c = '''' p_id = '''' else p_c = order_product.product_code p_id = order_product.id.to_s end end %> <td class="order_product_details" id="product_details"> <%= render :partial => "product_details", :locals => {:product_code => p_c, :noe => new_or_existing, :pid => p_id } %> </td> The "product_details" partial is actually more complex than just a simple description field, but that will suffice for the explanation. The problem is (and thanks if you are still will be at this point) that sometimes the description gets updated on the right "row" and other times the first line item row (or the bottom row if the row being entered isn''t the last one) in the table gets updated. The find_base_product method in the controller is quite simple - def find_base_product local_pc = params[:product_code] local_noe = params[:noe] local_pid = params[:pid] render :partial => ''product_details'', :layout => false, :locals => { :product_code => local_pc, :noe => local_noe, :pid => local_pid} end Here''s what I have observed. It seems to occur on "edit" not on "new". It happens with the first row added after the existing rows retrieved from the DB only. If it is the last row in the line item list, then it will update the text on the first row. If you add other line items and fill in the product code from them it works. If you then go back to the "bad" row and try again, then it will update the last row in the list. Additionally if you add multiple rows without entering product codes all off then are bad. I''m totally confused !!! Oh, we add new rows using the following in the main partial - <%= add_order_product_link "Add an Item (F1)" %> This is a helper method using pretty standard RJS - def add_order_product_link(name) link_to_function(name, nil, :id => ''f1_link'') do |page| page.insert_html :bottom, :order_products, :partial => ''order_product'', :object => OrderProduct.new end end All help gladly received !!! Phil -- Philip Nelson ScotDB Limited (teamdba-RvFq4O/J5Z7QT0dZR+AlfA@public.gmane.org) --~--~---------~--~----~------------~-------~--~----~ 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---