如何在Rails中借助Cocoon为每个嵌套子对象添加克隆按钮
错误根源
你遇到的报错是因为link_to_add_association方法的第二个参数传入的是子模型的表单builder(对应ActuationSetup模型),而actuation_setups是父模型MantenimientoSetup上的关联,子模型本身没有这个关联,所以触发了找不到关联的错误。
解决方案
只需两步修改即可实现需求:
- 父表单渲染子局部模板时,把父级表单builder传递到子模板中
- 子模板内的克隆按钮改用父级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
相关产品推荐
相关产品推荐

