我有一个类似“google forms”的平台,用户可以创建一个包含很多问题的表单,并选择他们的答案类型为文本字段或多个选项,因此,我将表单作为答案,如下所示:< / p>
# forms partial
<% f.object.form.questions.each do |q| %>
<% if q.text? %>
<%= render 'text', :f => f, :q => q %>
<% else %>
<%= f.simple_fields_for :multiple_choice do |m|%>
<%= f.label q.questions %>
<%= render 'forms/multiple_choice', :f => m, :q => q %>
<% end %>
<% end %>
<% end %>
# _text.html.erb
<%= f.fields_for :answers, q.answers.build do |m| %>
<%= m.input :answer, label: m.object.question %>
<%= m.input :question_id, as: :hidden %>
<% end %>
这适用于回答,但是,当用户无法填写其他必填字段时,表单会重新呈现并且不会重新加载答案,因为fields_for标记再次构建新的答案对象,构建的最佳方法是什么这些对象在表单上重新加载保存失败?
答案 0 :(得分:0)
最好的方法是在控制器的“新”操作中构建对象,而不是在视图中。 “创建”动作使用参数和render 'new'
安全性构建其他新对象,因为它不会覆盖任何对象,只需渲染。
查看this,了解发送fields_for :permission, @person.permission ...
答案 1 :(得分:0)
我最终通过在视图中构建正确的方法和构建答案对象并替换:
来解决这个问题<%= f.fields_for :answers, q.answers.build do |m| %>
使用:
<%= f.fields_for :answers, f.object.answers.select{|a| a.question_id==q.id } do |m| %>