How to use form_for with rjs


How can I use a form variable in a partial rendered from within a page.replace_html rjs call? Here's the problem:

I'm trying to render a partial with form fields using rjs.

In the erb template:

<% form_for :availability, @availability, :url => { :action => "post_listing" } do |f| %>

<%= @availability, availabilities, :id => "availability_type" %>

<%= observe_field(:availability_,                               :frequency => 0.5,                               :update => :availability,                               :url => { :controller => 'listing', :action => :change_availability_type}) %>

<% end %>

In the controller action:

def change_availability_type     render :update do |page|       page.replace_html "availability", :partial => "dry_lease"     end end

In the partial _dry_lease.rhtml:

<%= f.text_field :dry_lease_min_months %></p>

The problem is that the variable f in the partial above (i.e., f.text_field) is not set (it's nil).

In this part of the appllication, I need to dynamically render different partials with form elements depending on the option selected by the user.

When not using rjs, you could just pass the form variable to the partial using :locals => { }. But in rjs, the call to page.replace_html takes place in the controller, it's not clear how the form variable f could be set in the partial.


you can pass a parameter with the :with option

def change_availability_type    render :update do |page|      page.replace_html "availability", :partial => "dry_lease"    end end

In the partial _dry_lease.rhtml:

<%= f.text_field :dry_lease_min_months %></p>

You're going to need to create the form builder yourself. obviously
you don't want form_for since that would create form tags etc..., you
just want the bit of form_for that knows how to name form parameters
and so on, that bit is fields_for.


Based on Fred's suggestion, the solution is to (1) continue to use form_for to create the form, but (2) enclose the fields in each of the partials using fields_for. Each of the partials is then self- contained and can be dropped into the form using RJS page.replace_html. Thanks.