【发布时间】:2012-10-03 13:17:02
【问题描述】:
我目前有一个深度嵌套的复杂表单,我正在使用 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 的Issue #91 似乎与这个问题相同,但 dnagir 建议的解决方法(委托构建对象)在这种情况下并不理想,因为这会导致其他表单出现问题。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 activerecord cocoon-gem