2014-09-30 59 views
0

我的表单中包含以下内容。通过这段代码,我可以在页面上动态添加divisions,sub_divisions和sub_sub_divisions。问题是我添加的sub_sub_divisions被保存到第一个子分区,即使它们正确显示在视图的其他子分区上。我不知道视图和传递给控制器​​的错误之间发生了什么。非常感谢。Rails nested_form gem更新错误的父数据

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

回答

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

+0

嗨迭戈,感谢您的答复,但它并没有为我工作。我正在尝试动态创建新行,并且迭代<%= @ division.sub_divs.each do | sub_div | %>失败,错误消息未定义的方法'values_at'为零:NilClass – Tiamon 2014-10-01 07:23:46

+0

我认为'sub_divs'是'@ division'上的关系。你必须适应这条线,以便你有你的'sub_divs' – DiegoSalazar 2014-10-01 14:23:16

+0

再次感谢。我已经取得了一些进展,现在我知道哪里出了问题。动态添加的字段不是先构建的。我试图根据文档中的建议做到这一点,如下所示:<%= sub_div.link_to_add t(“add”),:sub_sub_divs,:model_object => SubSubDiv.default,:data => {:target =>“ #“+”sub_sub_divs“+”#{sub_sub_div.index.to_s}“,id:sub_div.object.id}%>但是然后错误信息告诉我默认没有定义 – Tiamon 2014-10-01 15:29:56