我有一个嵌套的表单,其中嵌套的子对象类型在表单上重复,以便我可以在表单元素中应用各种不同的默认值。我将它们分成不同的子对象类是没有意义的,因为我只是将它们分开,以便以对用户有意义的方式组织它们并填充不同的默认值;它们完全相同。
在我看来,我有类似的东西:
Children 1
<%= f.fields_for :children do |builder| %>
<% next if not builder.object.type == 1 %>
... fields for type 1 children ...
<% end %>
<%= f.link_to_add( "add child", :children ) %>
Children 2
<%= f.fields_for :children do |builder| %>
<% next if not builder.object.type == 2 %>
... fields for type 2 children ...
<% end %>
<%= f.link_to_add( "add child", :children ) %>
... etc ...
这很好,除了link_to_add
总是给出具有最终fields_for/builder
块的默认值的字段(即Type N Children),而不是使用fields_for/builder
块的默认值紧接在他们上方。如何为link_to_add
提供正确的功能?
来自https://github.com/ryanb/nested_form#enhanced-jquery-javascript-template:
您可以覆盖在表单中插入新子表单的默认行为。例如:
window.nestedFormEvents.insertFields = function(content, assoc, link) { return $(link).closest('form').find(assoc + '_fields').append($(content)); }
在我看来,必须对这个insertFields函数进行一些小的调整,这会使它复制所需的表单元素,而不仅仅是页面上的最终元素。我只有最简单的javascript经验,所以我希望有人可以指出那是什么!
仅供参考,完整的jquery文件在这里: https://github.com/ryanb/nested_form/blob/master/vendor/assets/javascripts/jquery_nested_form.js
非常感谢, 斯科特
答案 0 :(得分:1)
我忽略了发布我为此问题找到的解决方案。姗姗来迟,这就是。
我最终为我的子类型使用单表继承(STI),使每个类都成为一个类,即使这对我来说太过分了。然后,以下工作:
<h>ClassOneChild form</h>
<%= f.fields_for :class_one_children do |builder| %>
...
<% end %>
<%= f.link_to_add( "add child", :class_one_children ) %>
<h>ClassTwoChild form</h>
<%= f.fields_for :class_two_children do |builder| %>
...
<% end %>
<%= f.link_to_add( "add child", :class_two_children ) %>
...
<%= f.submit "Save Children" %>