我有一个带有remote: true
的simple_form。我正在用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>
除非在特定情况下,否则这一切都很有效。如果我正在编辑一个以前保存到数据库中的表格,并且有几个人,我就无法执行以下一系列活动:
link_to_remove_association
remote: true
)一切正常,直到我尝试执行第二次保存,此时我遇到了以下错误:
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和步骤2之间刷新页面,则没有问题。 3。
任何人都猜到了解决方案吗?非常感谢任何给出它的人。
修改
Upon further research,似乎cocoon并不是为了处理ajax提交而构建的。但是it seems可以通过异步替换dom中的元素来解决这个问题。注释仅提供所用过程的摘要。我猜他们做了像<%= escape_javascript(render(:partial => _person_fields.html.erb)) %>
这样的事情但是我不熟悉异步的异步渲染。我想我必须从dom中删除当前的部分,然后加载它的新版本。这是正确的想法吗?如果是这样,删除旧的部分,直接jquery的最佳方法是什么?