ruby-on-railsprototypejsrjs

Passing a form object to a partial rendered from an ajax request


I have an event form with some nested attribute models. The additional models are rendered after a client is selected from a select box. An observer watches and calls a controller action which renders a partial containing the fields_for nested models. The issue I'm having is that I can't pass the event 'form' block to the newly rendered partial - at least I can't figure out how...

The code below raises the error: "wrong number of arguments (0 for 1)". Any help or suggestions are appreciated. As mentioned below, I'm also willing to re-implement this using unobtrusive JavaScript if you can provide an example for this scenario.

Event Form:

<%- form_for @event do |form| %>

  <%= select_tag :id=>event_client_id %>
  <%= observe_field :event_client_id, url => {:action => 'client_questions'}, :with => "'client_id=' + encodeURIComponent(value)+'&event_id='+#{@event.id} %>

Event Controller

 def client_questions
   @event = Event.find(params[:event_id])
   @client = Client.find(params[:client_id])
   @client_questions = @client.questions.active
   respond_to do |format|
     format.js {
       render :update do |page|
         page[:client_questions].replace_html :partial => 'client_questions', :layout => false
       end
     }
   end
 end

_client_questions.html.erb partial

<%- form.fields_for :client, @client do |client| %>
  <%= client_text_field :name %>

  <%- client.fields_for :questions do |question| %>
    <%=question.text_field :content %>

Solution

  • So your main form is rendered in one action, and you're hoping to pass the form object from that view, to another view rendered in a second partial? That's not something that you can do, but you can modify your view code in the partial rendered the second time, so that it renders without needing the existing form object, something like:

    <%- fields_for "event[client_attributes]", @client do |client| %>
      <%= client_text_field :name %>
    
      <%- client.fields_for :questions do |question| %>
        <%= question.text_field :content %>
    

    I haven't run this code to test it, so compare the html it generates with the html that your existing partial would generate if it was rendered in the same action as the main form.