You need to enable JavaScript to run this app. 如何在Rails中借助Cocoon为每个嵌套子对象添加克隆按钮
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中借助Cocoon为每个嵌套子对象添加克隆按钮

错误根源

你遇到的报错是因为link_to_add_association方法的第二个参数传入的是子模型的表单builder(对应ActuationSetup模型),而actuation_setups是父模型MantenimientoSetup上的关联,子模型本身没有这个关联,所以触发了找不到关联的错误。

解决方案

只需两步修改即可实现需求:

  1. 父表单渲染子局部模板时,把父级表单builder传递到子模板中
  2. 子模板内的克隆按钮改用父级builder调用关联,同时修改wrap_object逻辑读取当前子项的属性进行复制

父表单代码修改

找到父表单中渲染子局部模板的代码,新增parent_f参数传递父级builder:

<!-- views/mantenimiento_setups/_form.html.erb -->
<div class="panel-body mantenimiento-setup-element">
  <%= f.fields_for :actuation_setups do |act_setup_builder| -%>
    <%= render 'actuation_setup_fields', f: act_setup_builder, parent_f: f %>
  <% end -%>
</div>

子局部模板代码修改

把克隆按钮的builder替换为传入的parent_f,同时调整wrap_object的取值逻辑:

<!-- views/mantenimiento_setups/_actuation_setup_fields.html.erb -->
<div class='row fields'>
  <div class="col-md-3 actuation-type-div-selector">
    ...
  </div>

  <div class="col-md-1">
    <label class="control-label invisible">...</label><br/>
    <%= link_to_remove_fields "Remove", f%>
  </div>

  <div class="col-md-1">
    <label class="control-label invisible">...</label><br/>
    <%= link_to_add_association 'Clone', parent_f, :actuation_setups, 
      data: {"association-insertion-node" => ".mantenimiento-setup-element", "association-insertion-method" => "append"}, 
      wrap_object: Proc.new {|d| f.object.dup}, 
      class: "btn btn-info btn-sm" %>
  </div>
</div>

补充说明

如果需要排除克隆时不需要的字段(比如主键id、创建时间等),可以修改wrap_object逻辑:

wrap_object: Proc.new {|d| f.object.dup.tap { |new_obj| new_obj.id = nil; new_obj.created_at = nil } }

内容的提问来源于stack exchange,提问作者jsaez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 03:24:03