嵌套表单中的belongs_to关联无法正确发布数据

时间:2015-10-19 20:32:55

标签: ruby-on-rails forms nested-forms

我很难弄清楚为什么表单中的帖子数据没有正确发布。

我必须建模:儿童和父母

以Child的形式我以这种方式嵌套父形式:

<%
parent = (child.parent) ? parent : Parent.new
%>
<%=f.fields_for :parent, parent do |builder| %>
          <%= render 'parent_fields', :fp => builder %>
<% end %> 

parent_fields表格如下:

<% @all_parents = Parent.all %>
<% parent = fp.object %>
<%= fp.fields_for :parent do |builder| %>
       <%= builder.input :parent_id, :as => :select, :label => 'Parent: ', :required => false, 
         :collection => options_from_collection_for_select(@all_parents, "id", "name", parent.id), :include_blank => '- Select -' %>
 <% end %>  

发布的数据哈希显示如下:

"parent_attributes"=>{"parent"=>{"parent_id"=>"6"}, "id"=>"36"}

其中36是旧的父ID,6是新的。

当我执行update_attributes时,它不起作用,这是正常的,因为如果哈希将是这样的话,它会起作用:

...    
"parent_id" => 6
"parent_attributes"=>{"id"=>"36", ....}
...

我正在研究遗留代码。也可以通过javascript修改数据。这篇文章的目的是确保我写表单的方式是正确的,因为我是嵌套表单的新手。

谢谢

1 个答案:

答案 0 :(得分:0)

您可能需要考虑两种可能的情况: 1.孩子需要选择其所属的现有父级。 2.孩子需要创建一个它所属的全新父母。

您似乎要执行#1,选择现有父级。如果是这样,您不需要fields_for。字段用于创建新关系。

我将向您展示我正在处理的关于学校的应用程序的示例代码,其中学生belongs_to为年级。

应用/视图/生/ _form.html.erb

<%= form_for @student do |student_form| %>
    <%= student_form.text_field :first %>
    <%= student_form.text_field :last %>
    <%= student_form.collection_select :grade_level_id, GradeLevel.all, :id, :name %>
    <%= student_form.submit "Save" %>
  <% end %>

现在,使用你的模型(Child和Parent):

应用/视图/儿童/ _form.html.erb

<%= form_for @child do |form| %>
  <%= form.text_field :child_name %>
  <%= form.number_field :age %>
  <%= form.collection_select :parent_id, Parent.all, :id, :name %>
  <%= form.submit "Save" %>
<% end %>

请注意,我只是将Parent.all直接放入collection_select。无需创建上面的@all_parents

修改

如果你想每次创建新的父母......

应用/视图/儿童/ _form.html.erb

<%= form_for @child do |form| %>
  <%= form.text_field :child_name %>
  <%= form.number_field :age %>
  <% form.fields_for :parent, @child.parent do |parent_fields| %>
    <%= parent_fields.text_field :parent_name %>
  <%= form.submit "Save" %>
<% end %>