Dave Dumaresq
2006-Jul-21 03:05 UTC
[Rails] Selecting customers and addresses in a form (was Getting joined collections on a form)
(Sorry if you have received this twice, I''m having trouble sending mail to the rails list) 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'')")} ) %> <div id="customer"></div> <%= hidden_field :invoice, :customer_id, :value => "" %> <%= submit_tag ''Add Invoice'' %> <% end %> 2) 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'')") }) %> 3) 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 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://wrath.rubyonrails.org/pipermail/rails/attachments/20060721/48746f82/attachment-0001.html