現在、深い入れ子のある複雑なフォームがあり、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と、RyanBatesのnested_formgemの両方に関連しているように見えることを言及する価値があります。コクーンジェムの問題#91はこれと同じ問題のようですが、dnagir(オブジェクトの構築を委任する)によって提案された回避策は、他のフォームで問題を引き起こすため、この状況では理想的ではありません。