How to use remote_form_tag?

I have a partial that gets rendered in response to a #link_to_remote call. What I want to do is to display a select box, when the user selects an item from that box, display a second select box, when the user selects an item from that box, display a link (or possibly a submit button) allowing the user to do something.

Here is my partial:

<%= select_tag "use_part",     options_for_select(@parts, @use_part),     :onchange => "#{remote_function(:url => "select_assembly",                   :update => "disposition",                   :with => "'use_part='+$('use_part').value")}" %> <% if @use_part %>   <%= select_tag "use_lot",       options_for_select(@lots, @use_lot),       :onchange => "#{remote_function(:url => "select_assembly",                    :update => "disposition",                    :with => "'use_lot='+$('use_lot').value+'&use_part='+$('use_part').value")}"    %> <% end %>

<% if @use_lot %>   <%= link_to_remote "Use",       :url => {:action => "use_in_assembly"},       :update => "disposition",       :with => "'use_lot='+$('use_lot').value+'&use_part='+$('use_part').value+'&id='+$('id').value"    %> <% end %>

This works, but it seems pretty ugly, especially the bid where I keep appending more and more variables to the :with clause. As I was thinking about this last night, I started wondering if perhaps I should have used the #remote_form_tag helper. That way, when the form was submitted, the data contained in the form would be POSTed along with it and I wouldn't have to keep appending parameters to the :with clause.

The problem is (if it isn't obvious by now), I haven't the foggiest idea what I'm doing. Should I add an :onchange clause to the remote form tag? If so, what javascript function should it call? Should it include the :update => "disposition" option, indicating that the result should replace the contents of the "disposition" div (BTW, this partial is the only thing within that div). Should the select tags (continue to) have the :update option invoking the #select_assembly action on my controller?

I'll keep muddling through this and will probably learn some answers sooner or later (or possibly give up in a blue depressive funk), but I thought I would ask what other folks do or have done.

--wpd

Here is my best idea so far, which, unfortunately, doesn't work...

<% form_remote_tag :url => "select_assembly", :update => "disposition", :html => {:id => 'xxx'} do %>   <%= select_tag "use_part",       options_for_select(@parts, @use_part),       :onchange => "$('xxx').submit()"    %>   <% if @use_part %>     <%= select_tag "use_lot", options_for_select(@lots, @use_lot) %>     <% if @use_lot %>       submit somehow     <% end %>   <% end %> <% end %>

I call it my "best" idea because it seems to make sense to me. Since it doesn't work, it obviously doesn't make the correct sense to me.

The #form_remote_tag creates a form with an "onsubmit" attribute that looks like:

onsubmit="new Ajax.Updater('disposition', 'select_assembly', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;"

That looks an awful lot like AJAX/JavaScript code I've seen else where that should update the "disposition" div when the form is submitted. My #select_tag has an :onchange attribute that submits the form.

That makes sense to me, and it almost, sortof, kinda, works. The part that doesn't work is the AJAX thing -- instead of updating the "disposition" div, my browser (FF) gets directed to a new page (http://…/select_assembly) and displays the raw HTML for 2 select boxes. (I render that, without a layout, in my #select_assembly action).

Why doesn't the "disposition" div update? What am I missing?

--wpd

Just in case anybody is interested in this thread... here is what I got to work for me:

<% form_remote_tag :url => "select_assembly", :update => "disposition" do %>   <%= disposition_select_tag "use_part", @parts, @use_part %>   <% if @use_part %>     <%= disposition_select_tag "use_lot", @lots, @use_lot %>      <% if @use_lot %>       submit somehow     <% end %>   <% end %> <% end %>

where I defined #disposition_select_tag in my helpers file as:

  def disposition_select_tag(name, container, selected)     select_tag(name,                options_for_select(container, selected),                :onchange => 'if (this.up("form").onsubmit()){this.up("form").submit();}')   end

The piece that I was missing was that there seems to be a difference between calling the submit() JavaScript function, which acted like a normal form submit, pointing my browser to a new URL, and calling onsubmit(), which executed the AJAX code to do the update in the background.

If anybody has read this thread this far... thanks for the company :slight_smile:

--wpd