belongs_to 嵌套形式的关联 post 数据不正确

belongs_to association in nested form does not post data correctly

我很难弄清楚为什么表单中的 post 数据没有 post 正确编辑。

我必须建模:Child 和 Parent

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

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

posted数据哈希显示如下:

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

其中 36 是旧的 parent id,6 是新的。

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

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

我正在处理遗留代码。也有可能数据被 javascript 修改了。 post 的目的是确保我编写表单的方式是正确的,因为我是嵌套表单的新手。

谢谢

您要考虑两种可能的情况: 1、一个child需要select一个已有的parent它所属。 2. 一个child需要创建一个属于它的全新parent

您似乎想要执行 #1,select 一个现有的 parent。如果是这样,则不需要 fields_for。用于创建新关系的字段。

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

app/views/students/_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):

app/views/children/_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

编辑

如果您想每次都创建新的 parents...

app/views/children/_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 %>