Rails 4嵌套表单.

bla*_*der 4 ruby-on-rails ruby-on-rails-4

我正在为客户构建动态表单.表格有许多形式问题,有许多形式的答案.截至目前,我能够在Active Admin中很好地创建所有内容,并通过应用程序界面上的show动作显示它.这是我遇到的问题.我想显示表单标题(正在工作),以及表单问题(正在运行),以及输入字段以动态提交新表单答案(这是不起作用的部分).在嵌套表单方面,我觉得我已经筋疲力尽了.我将在下面发布我的代码.

形成

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

这是模特

class Form < ActiveRecord::Base
  has_many :form_questions, dependent: :destroy
  accepts_nested_attributes_for :form_questions, allow_destroy: true
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
class FormAnswer < ActiveRecord::Base
  belongs_to :form_question
end
Run Code Online (Sandbox Code Playgroud)

和我的表格控制器

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
Run Code Online (Sandbox Code Playgroud)

Pav*_*van 7

首先,你应该uncomment在你的new方法中使用那两行.我猜它们是正确的.

def new
 @form = Form.new
 @form_questions = @form.form_questions.build
 @form_answers = @form_questions.form_answers.build
end
Run Code Online (Sandbox Code Playgroud)

而在你的create行动,你是不是savingdata

def create
 @form = Form.new(form_params)
 if @form.save
   .....
 else
  .....
 end
end
Run Code Online (Sandbox Code Playgroud)

其次,您的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 :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 %>
Run Code Online (Sandbox Code Playgroud)