railscast #198を個別に編集しましたが、1つのフォームから複数のレコードを編集する場合に100%機能します。
ただし、レコードの場合は、同じフォームから新しいレコードも作成したいと思います。つまり、コントローラーでフォームからパラメーターのハッシュを評価し、存在するレコードを更新して、存在しないレコードを作成します。
また、検証エラーが発生した場合は、それらをキャッチして返す必要があります。
これはコントローラーで機能し、新しいレコードのフィールドが存在しない場合は正しく更新されます@costs = IngredientCost.update(params [:ingredient_costs] .keys、params [:ingredient_costs] .values).reject {| item | item.errors.empty?}
新しいレコードのフィールドについては、現在、レコードIDとして任意の大きな一意の番号を作成しています(これが正しいかどうかはわかりません)。その後、IDが保存されないため、保存できないというメッセージが返されます。存在します、それは私が存在しないので予想されることです。
次の2つのスニペットを暗闇の中で突き刺してみましたが、どちらに進むべきかよくわかりません。
@costs = IngredientCost.find_or_initialize_by_id(:id => params[:ingredient_costs].keys).update(params[:ingredient_costs].keys, params[:ingredient_costs].values).reject { |i| i.errors.empty? }
と
params[:ingredient_costs].each do |ingredient_cost|
@cost = IngredientCost.find_or_initialize_by_ingredient_id_and_user_id(:ingredient_id => ingredient_cost[1]["ingredient_id"], :user_id => current_user.id)
@cost = IngredientCost.update(:ingredient_id => params[:ingredient_costs][ingredient_cost[0]]["ingredient_id"], :quantity => params[:ingredient_costs][ingredient_cost[0]]["quantity"], :price_per_unit => params[:ingredient_costs][ingredient_cost[0]]["price_per_unit"], :weight_id => params[:ingredient_costs][ingredient_cost[0]]["weight_id"])
どちらも機能していないようです。
私は以前にこの作業を見たことがありますが、1つのフォームからネストされた属性を更新/作成するためのものです。私は本当にこれでそのルートに行く必要はありません。