2

ネストされたフォームがあり、その中に別のフォームがあります。基本的に、私が持っているのはたくさんの原料であり、各原料について、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);
})
4

1 に答える 1

1

フォーム ヘルパーは、モデル間の関係を調べて、パラメーターを送信する方法を見つけ出します。モデルに含めaccepts_nested_attributes_for :entry_ingredientsましたか?Ingredient

于 2013-03-18T16:18:00.303 に答える