В настоящее время у меня сложная форма с глубоким вложением, и я использую 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
Любая помощь была оценена, чтобы получить эту работу, или предложить другой способ создания этих объектов динамически.
Спасибо!
EDIT: Возможно, стоит упомянуть, что этот вопрос, по-видимому, имеет отношение как к драгоценному камню Cocoon, упомянутому выше, так и к драгоценному камню Райана Бейтса nested_form. Проблема № 91 для драгоценного камня Cocoon представляется такой же проблемой, как и эта, но обходной путь, предложенный dnagir (делегирование здания объектов), не идеален в этом ситуация, так как это вызовет проблемы в других формах.