在@ object.save失败时重新加载多个嵌套字段值

时间:2014-10-24 17:07:54

标签: ruby-on-rails

我有一个类似“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标记再次构建新的答案对象,构建的最佳方法是什么这些对象在表单上重新加载保存失败?

2 个答案:

答案 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| %>