Getting joined collections on a form

Greetings, I’m looking for suggestions on how to simplify getting
customer
addresses on a form:

I’m jumping between controller and view several times; alternating
between
rhtml and rjs, in order to display customers and their addresses on an
invoicing form. It’s very messy.

I have a one to many relationship between Customer and Addresses, each
customer has one or more addresses. The user opens the Invoice form and
selects from a list of customers which in turn populates and displays a
list
of that customer’s addresses.

It works like this:

  1. The Invoice controller receives a new request and renders the
    new.rhtmlform:

/invoices/new

def new
@invoice = Invoice.new
@customers = Customer.find(:all, :order => “name”)
end

new.rhtml

<% form_for :invoice, @invoice, :url => { :action => “create” } do |f|
%>
Customer:
<%=
collection_select(:invoice, :customer_id, @customers, :id,
:name,
{:include_blank => true},
{:onchange => remote_function(:url => { :action =>
“get_customer”},
:with => “‘invoice_customer_id=’+
$F(‘invoice_customer_id’)”)}
)
%>


<%= hidden_field :invoice, :customer_id, :value => “” %>
<%= submit_tag ‘Add Invoice’ %>
<% end %>
  1. The onchange event calls the controller action get_customer, which
    does a
    find on the selected customer_id. It also gets the address collection
    and
    then Rails renders the customer.rjs which in turn inserts customer.rhtml

/invoices/get_customer/1

def get_customer
@customer = Customer.find(params[:invoice_customer_id])
@addresses = Customer.find(params[:invoice_customer_id]).addresses
end

customer.rjs

page[:customer].replace_html :partial => ‘customers/customer’, :object
=>
@customer
page[:customer].visual_effect :highlight

customer.rhtml

<%=
    collection_select(:invoice, :address_id, @addresses, :id, 

:street,
{:include_blank => true},
{
:onchange => remote_function(:url => { :action =>
“get_address”},
:with => “‘invoice_address_id=’+ $F(‘invoice_address_id’)”)
})
%>

  1. Next a similar pattern occurs for addresses…

Back we go to the controller with the action get_address and then render
address.rjs and then address.rhtml. It’s annoying because I have other
values to gather on this form that also have multiple joins.

I suspect the culprit of this complexity is the onchange event and
remote_function calls. I’ve considered calling a local javascript
function
to expose the selected customer’s addresses – they are available via
the
@customer object thanks to the has_many relationship — however, I
haven’t
figured out how to do that.

Possibly a entirely different solution exists. Your thoughts and ideas
are
gratefully appreciated!
–Dave

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs