我目前有一个深度嵌套的复杂表单,我正在使用Cocoon gem 来根据需要动态添加部分(例如,如果用户想要在销售表单中添加另一辆车)。代码如下所示:
<%= sale.fields_for :sale_vehicles do |sale_vehicles_builder| %>
<%= render :partial => "sale_vehicles/form", :locals => {:f => sale_vehicles_builder, :form_actions_visible => false} %>
<% end -%>
<div class="add-field-links">
<%= link_to_add_association '<i></i> Add Vehicle'.html_safe, sale, :sale_vehicles, :partial => 'sale_vehicles/form', :render_options => {:locals => {:form_actions_visible => 'false', :show_features => true, :fieldset_label => 'Vehicle Details'}}, :class => 'btn' %>
</div>
这对于第一级嵌套非常有效 -sale_vehicle
对象由 Cocoon 正确构建,并且表单按预期呈现。
当有另一层嵌套时问题就来了 -sale_vehicle
部分看起来像这样:
<%= f.fields_for :vehicle do |vehicle_builder| %>
<%= render :partial => "vehicles/form", :locals => {:f => vehicle_builder, :f_parent => f, :form_actions_visible => false, :show_features => true, :fieldset_label => 'Vehicle Details'} %>
<% end -%>
的部分vehicle
渲染没有字段,因为没有sale_vehicle.vehicle
构建对象。
因此,我需要做的是与主对象一起构建嵌套对象(Cocoon 目前不构建任何嵌套对象),但如何最好地做到这一点?有没有办法从帮助代码中选择嵌套表单以便构建它们?
Cocoon 目前构建的主要对象是这样的:
if instance.collection?
f.object.send(association).build
else
f.object.send("build_#{association}")
end
如果我可以执行以下操作,它将使事情变得简单而简单,但是我不确定如何获得f.children
-有没有办法从父表单构建器访问嵌套表单构建器?
f.children.each do |child|
child.object.build
end
任何帮助都可以得到这个工作,或者建议另一种动态构建这些对象的方法。
谢谢!
编辑:可能值得一提的是,这个问题似乎与上面提到的 Cocoon gem 以及 Ryan Bates 的nested_form gem 有关。Cocoon gem 的问题 #91似乎与此问题相同,但 dnagir 建议的解决方法(委托构建对象)在这种情况下并不理想,因为这会导致其他表单出现问题。