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