Rails 4 嵌套表单。

4
我正在为客户构建一个动态表单。一个表单有很多问题,每个问题有很多答案选项。目前,我能够在Active Admin中很好地创建所有内容,并通过应用程序界面上的显示操作进行显示。这里是我的问题:我想显示表单标题(已经可以实现),以及表单问题(也可以实现),以及输入字段以便即时提交新的表单答案(这是没有实现的部分)。对于嵌套表单,我感觉已经尝试了所有可能性。我将在下面发布我的代码。
表单
<%= 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 %>

这里是模型。
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

我的表单控制器
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

你能发布你的“服务器日志”吗? - Pavan
为什么你在 new 动作中注释掉了那两行代码?我猜它们是正确的。 - Pavan
我对这行代码 <%= ff.text_field :form_answers %> 感到困惑。form_answers 是你的 form_questions 中的一个属性吗? - Pavan
1个回答

7
首先,在您的 new 方法中,您应该取消注释这两行代码。我猜想它们是正确的。
def new
 @form = Form.new
 @form_questions = @form.form_questions.build
 @form_answers = @form_questions.form_answers.build
end

在你的create操作中,你没有保存data
def create
 @form = Form.new(form_params)
 if @form.save
   .....
 else
  .....
 end
end

其次,你的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 %>

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Harsha M V
1
你能演示一下如何为嵌套表单添加强参数吗? - Harsha M V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接