如何使用 cocoon 在 Rails 中克隆子对象?

How could I clone a child object in Rails using cocoon?

我有一个父对象,其中包含许多非常相似的子对象。我有一个带有 table 的表格,可以使用 cocoon 编辑它们。有了它(和 this answer),我可以将新行添加到 table,并删除现有行,它工作得很好。

我想要做的是在该行的末尾添加另一个按钮,与删除按钮一起,将该行克隆为新行。

家长形式:

= simple_form_for @release, html: { multipart: true } do |f|
  = f.error_notification
  .col-md-12
    %table#myTable.table-striped.table-bordered
      %thead
        %tr
          %th Description
          ...
          %th Remove

      %tbody.codes
        = f.simple_fields_for :codes, wrapper: false do |code|
          = render 'code_fields', f: code
          ---> New code below would go here <---

    .links
      = link_to_add_association 'Add Code', f, :codes, data: {"association-insertion-node" => "tbody.codes", "association-insertion-method" => "append"}

    .form-actions
      = f.button :submit, class: 'btn btn-primary pull-right'

子部分:

%tr.nested-fields
  = f.input :id, as: :hidden
  %td= f.input :description, label: false, input_html: { class: 'input-sm myinput' }
  ...
  %td
    = link_to_remove_association f, class: 'btn btn-default btn-xs' do
      .glyphicon.glyphicon-remove

我希望能够将类似这样的内容添加到该行的最后一个 td 元素:

= link_to_add_association 'Clone', f, :codes, data: {"association-insertion-node" => "tbody.codes", "association-insertion-method" => "append"}, render_options: {locals: {code: code.object}}

我有两个问题。首先,cocoon 预先生成要插入的 HTML 的方式,我不能将此函数调用放在部分中,因为——即使我的语法正确——它也会创建一个无限循环。

我很乐意通过某种方式 jQuery 将 DOM 节点放置在适当 table 行的最后一个单元格中,如果有的话使用当前对象的值 "seed" HTML 生成的方法。在我想插入 "clone" 按钮时,我在 code.object 变量中有当前 "code" 子对象。 (因为 code 此时是 fields_for 表单对象。)

有什么办法吗? render_options 看起来很有希望,但我不知道这是否只是一个语法问题,或者如果生成器永远不会查看我在生成字段时传递给它的值的散列值。

看看 :wrap_object 选项,它允许预初始化对象,我认为您也应该能够使用它从现有对象克隆。

例如这样的事情可能会起作用:

- code_to_clone = f.object
= link_to_add_association('Clone', f, :codes,
    wrap_object: Proc.new { |new_code| new_code.name = code_to_clone.name; new_code })

仅复制 1 个字段用于演示目的:)