1

我有一个 simple_form remote: true。我正在使用 cocoon 向其中添加嵌套字段(此示例中的人)。

<%= simple_form_for @incorporation, html: {id:"incorporationform"}, remote: true, update: { success: "response", failure: "error"} do |f| %>
    <%= f.simple_fields_for :company do |company| %>
        <div id="people" class="form_section">
            <div class="form-right">
                <div id="dynamic-person" class="dynamic-entity level1 person entityAttributes">
                    <%= company.simple_fields_for :people do |person|%>
                        <%= render 'person_fields', f: person %>
                    <% end %>
                    <div><%= link_to_add_association 'Add Person', company, :people, class: "btn btn-default add-button" %></div>
                </div>
            </div>
        </div>

除了在特定情况下,这一切都很好。如果我正在编辑一个以前保存到数据库中且只有几个人的表单,我将无法执行以下活动序列:

  1. 删除一个人link_to_remove_association
  2. 通过 ajax 保存更改(记住,remote: true
  3. 进行任何其他更改
  4. 再次通过ajax保存

一切正常,直到我尝试执行第二次保存,此时我遇到以下错误:

19:19:38 web.1  | ActiveRecord::RecordNotFound (Couldn't find Person with ID=33 for Company with ID=1):

指的Person with ID=33是我在步骤 1 中删除的人。当我检查people表时,在我的数据库中。 Person 33确实消失了(表明我在第 2 步中的保存很好)。我对正在发生的事情的解释是,在保存删除后,远程表单忘记了它Person 33已经消失并在下一次保存时寻找他。

remote: false绝对清楚,如果我在第 2 步和第 3 步之间刷新页面,则没有问题。

有人对此有一个解决方案的猜测吗?非常感谢任何试一试的人。

编辑
经过进一步研究,cocoon 似乎并不是为处理 ajax 提交而构建的。然而,这似乎可以通过异步替换 dom 中的元素来解决。该评论仅提供所用过程的摘要。我猜他们做了类似<%= escape_javascript(render(:partial => _person_fields.html.erb)) %> 但是我不熟悉的局部异步渲染。我想我必须从 dom 中删除当前的部分,然后加载它的新版本。这是正确的想法吗?如果是这样,删除旧部分的最佳方法是什么,只是直接的 jquery?

4

0 回答 0