Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 4 Nested Form.

I am building a dynamic form for a client. A form has many form questions which has many form answers. As of now, I am able to create everything nicely in Active Admin and have it displaying through the show action on the app interface. Here is the problem I have. I want to display the form title (which is working), along with the form questions (which is working), along with input fields to submit new form answers on the fly (which is the part that is not working). I feel like I have exhausted everything when it comes to nested forms. I will post my code below.

Form

<%= form_for @form do |f| %>
  <div class="field">
    <h1><%= @form.name %></h1>
  </div>
  <%= f.fields_for :form_questions do |ff| %>
    <div class="field">
      <%= ff.label :title  %>
      <%= ff.text_field :form_answers %>
    </div>
  <% end %>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

Here is the models

class Form < ActiveRecord::Base
  has_many :form_questions, dependent: :destroy
  accepts_nested_attributes_for :form_questions, allow_destroy: true
end

class FormQuestion < ActiveRecord::Base
  belongs_to :form
  has_many :field_types
  has_many :form_answers, dependent: :destroy
  accepts_nested_attributes_for :field_types
  accepts_nested_attributes_for :form_answers
end

class FormAnswer < ActiveRecord::Base
  belongs_to :form_question
end

And my form controller

class FormsController < ApplicationController

  def new
    @form = Form.new
    # form_questions = @form.form_questions.build
    # form_answers = form_questions.form_answers.build
  end

  def create
    @form = Form.new(form_params)
  end

  def index
    @forms = Form.includes(:form_questions).all
  end

  def show
    @form = Form.find(params[:id])
  end

  def edit
    @form = Form.find(params[:id])
  end

  def form_params
    params.require(:form).permit(:id, :name, form_questions_attributes: [:title, form_answers_attributes: [:answer]])
  end


end
like image 835
blakeyoder Avatar asked Mar 19 '23 20:03

blakeyoder


1 Answers

Firstly,you should uncomment those two lines in your new method.I guess they are correct.

def new
 @form = Form.new
 @form_questions = @form.form_questions.build
 @form_answers = @form_questions.form_answers.build
end

And in your create action,you are not saving the data

def create
 @form = Form.new(form_params)
 if @form.save
   .....
 else
  .....
 end
end

Secondly,your form code should look like this

<%= form_for @form do |f| %>
  <div class="field">
    <h1><%= @form.name %></h1>
  </div>
  <%= f.fields_for @form_questions do |ff| %>
    <div class="field">
      <%= ff.label :title %>
      <%= ff.text_field :title %>
    </div>  
    <%= ff.fields_for @form_answers do |fa| %> #Here comes the important step
      <div class="field" %>
        <%= fa.label :answer %>
        <%= fa.text_field :answer %>
      </div>
    <% end %> 
  <% end %>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>
like image 143
Pavan Avatar answered Mar 23 '23 23:03

Pavan