ネストされたフォームがあり、その中に別のフォームがあります。基本的に、私が持っているのはたくさんの原料であり、各原料について、EntryIngredient と呼ばれる Entry と Ingredient の間の関連付けテーブルに格納されている数量と単位があります。次の JS を使用すると、動的フィールドを追加できますが、送信すると AssociationTypeMismatch エラーが発生します。理由はわかりませんが、パラメータは適切に見えます ( "ingredients_attributes"=>{"0"=>{"name"=>"Salt", "entry_ingredients"=>{"quantity"=>"2.5", "unit"=>"tbspns"}, "_destroy"=>""}}}}
)。何が欠けているのでしょうか? entry_ingredients
実際には、の代わりにas を送信していることが原因かもしれないと思いますがentry_ingredients_attributes
、2 番目の入れ子になったフォームで別の方法を行ったことはわかりません。以下は、材料のフィールドを持つ最初のフォームです。
<div id="ingredients">
<p>Ingredient List:</p>
<%= f.fields_for :ingredients, @entry.ingredients.build do |builder| %>
<%= render 'ingredient_fields', :f => builder %>
<% end %>
</div>
<div id='add_ingredient'>Add Ingredient</div>
<div class="actions">
<%= f.submit %>
entry_ingredients のコードは次のとおりです。
<ul id="ingredient_list">
<li>
<%= f.label :name %>
<%= f.text_field :name, :class => "ingredient_field" %>
<%= f.hidden_field :_destroy, :class => "delete_ingredient" %>
<%= f.fields_for :entry_ingredients, @entry.entry_ingredients.build do |builder| %>
<%= render 'entry_ingredient_fields', :f => builder %>
<% end %>
<%= link_to "Remove", "#", :class => "remove_fields" %>
</li>
</ul>
新しい成分を動的に追加するための私のJSは次のとおりです。
$('form').on('click', '#add_ingredient', function(){
count = $('#ingredient_list li').length;
field = $('#ingredient_list li').first()
.clone() //clone the first element in the list
.find('input') //find all its inputs
.val('') //set all input values to blank
.end()
.find($('.ingredient_field'))
.prop({id: 'entry_ingredients_attributes_' + count + '_name', name: 'entry[ingredients_attributes][' + count +'][name]' })
.end()
.find($('.delete_ingredient'))
.prop({id: 'entry_ingredients_attributes_' + count + '__destroy', name: 'entry[ingredients_attributes][' + count +'][_destroy]', value: 'false' })
.end()
.find($('.ingredient_quantity'))
.prop({id: 'entry_ingredients_attributes_' + count + '_entry_ingredients_quantity', name: 'entry[ingredients_attributes][' + count +'][entry_ingredients][quantity]'})
.end()
.find($('.ingredient_unit'))
.prop({id: 'entry_ingredients_attributes_' + count + '_entry_ingredients_unit', name: 'entry[ingredients_attributes][' + count +'][entry_ingredients][unit]'})
.end();
$('#ingredient_list').append(field);
})