使用cocoon

时间:2015-07-21 01:32:48

标签: ruby-on-rails ajax simple-form cocoon-gem remote-forms

我有一个带有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>

除非在特定情况下,否则这一切都很有效。如果我正在编辑一个以前保存到数据库中的表格,并且有几个人,我就无法执行以下一系列活动:

  1. 删除link_to_remove_association
  2. 的人
  3. 通过ajax保存更改(请记住,remote: true
  4. 进行其他更改
  5. 再次通过ajax保存
  6. 一切正常,直到我尝试执行第二次保存,此时我遇到了以下错误:

    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的最佳方法是什么?

0 个答案:

没有答案