【问题标题】:belongs_to association in nested form does not post data correctly嵌套形式的 belongs_to 关联不能正确发布数据
【发布时间】:2015-10-19 20:32:55
【问题描述】:

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

我必须建模:孩子和父母

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

发布的数据哈希如下:

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

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

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    看来你想做#1,选择一个现有的父母。如果是这样,您不需要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 %>
    

    现在,使用您的模型(孩子和父母):

    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

    编辑

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

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

    【讨论】:

    • 我知道这适用于 parent_id。您如何设法编写父级的其他字段。假设父母有字段:field1 和 field2,您要使用 child.update_attributes 更新。为了清楚起见,我只需要表格,因为在适合我的控制台中(这意味着模型已正确设置)。
    • 让我知道它是如何工作的。 fields_for 的其余文档在这里:api.rubyonrails.org/classes/ActionView/Helpers/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多