Rails nested_form gem更新错误的父数据

时间:2014-09-30 14:27:01

标签: ruby-on-rails forms gem nested

我的一个表格中有以下内容。使用此代码,我可以在页面上动态添加divisions,sub_divisions和sub_sub_divisions。问题是我添加的sub_sub_divisions被保存到第一个sub_division,即使它们正确地显示在视图上的其他sub_divisions上。我不知道视图和传递给控制器​​的内容之间发生了什么,以发生此错误。非常感谢。

<%= nested_form_for @division do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <table>
    <tr>
      <td>
        <%= f.label t("name") %>
        <%= f.text_field :name, class: 'form-control' %>
      </td>
      <td>
        <%= f.label t("description") %>
        <%= f.text_field :description, class: 'form-control' %>
      </td>
    </tr>
    <tr><td><h3><%=t :sub_divisions %></h3></td></tr>
    <tr>
      <td colspan=4>
        <table id="sub_divs" class="table table-condensed table-striped">
          <tr><th><%=t :name %></th><th><%=t :description %></th></tr>
          <%= f.fields_for :sub_divs, :wrapper => false do |sub_div| %>
            <tr class="fields">
              <td><%= sub_div.text_field :name, class: 'form-control' %></td>
              <td><%= sub_div.text_field :description, class: 'form-control' %></td>
              <td><%= sub_div.link_to_remove t("delete") %></td>
            </tr>
              <td colspan=3>
                <table id="<%= 'sub_sub_divs' + sub_div.index.to_s %>">
                  <tr><th><%=t :name %></th><th><%=t :description %></th></tr>
                  <%= sub_div.fields_for :sub_sub_divs, 
                                          :wrapper => false do |sub_sub_div| %>
                    <tr class="fields">
                      <td><%= sub_sub_div.text_field :name,
                                         class: 'form-control' %></td>
                      <td><%= sub_sub_div.text_field :description, class:
                                                      'form-control' %></td>
                      <td><%= sub_sub_div.link_to_remove t("delete") %></td>
                      <td><%= sub_sub_div.hidden_field :id,
                              value: sub_sub_div.object.sub_div_id %></td>

                    </tr>
                  <% end %>
                </table>
              </td>
            </tr>
            <tr>
               <td colspan=3 class="pull-right">
                       <%= sub_div.link_to_add t("add") + 
                           t("sub") + t('sub') + t('div'), :sub_sub_divs,
                     :data => { :target => "#"+"sub_sub_divs" +     
                                #{sub_div.index.to_s}", id: sub_div.object.id} %>
               </td>
            </tr>
          <% end %>
        </table>
      </td>
    </tr>
    <tr><td colspan=2 class="pull-right">
           <%= f.link_to_add t("add") + t("sub") + t('div'),
             :sub_divs, :data => { :target => "#sub_divs"} %></td></tr>
    <tr><td><%= f.submit t("update"), class: "btn btn-primary" %></td></tr>
  </table>
<% end %>

1 个答案:

答案 0 :(得分:0)

在您致电

之外
<%= f.fields_for :sub_divs, :wrapper => false do |sub_div| %>

你应该遍历sub_divs:

<%= @division.sub_divs.each do |sub_div| %>

然后将每一个传递给fields_for调用作为第二个参数:

<%= f.fields_for :sub_divs, sub_div, :wrapper => false do |sub_div| %>

对下一个嵌套sub_sub_div执行相同操作,最后:

<%= sub_sub_div.hidden_field :id,
     value: sub_sub_div.object.sub_div_id %>

...将有正确的sub_div_id