2

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つのフォームからネストされた属性を更新/作成するためのものです。私は本当にこれでそのルートに行く必要はありません。

4

2 に答える 2

3

私は最終的に、すでに正しい関連付けを持っている親モデルを介して複数のレコードを保存することにしました。

Railscast #196 Nested Model Formsに従いました。これは上記とかなり似ていましたが、別のモデルに保存しaccepts_nested_attributes_forてそのモデルの *.rb に配置しただけです。

ルートを移動することを忘れないでください。

コントローラーのコードを親モデルの受信アクションに移動します。

ビューアーのフォームは次のようになります (haml 形式):

= form_for @user, :remote => true do |f|
  = f.fields_for :ingredient_costs do |builder|
    // fields inserted here

builder.object...私が実際に興味を持っている子供に到達するために使用しなければならないことに気付くのに数時間かかりました. .objectクラスは私には明らかではありませんでした。

とにかく、これが誰かに役立つことを願っています。SybariteManoj の答えはかなりのように思えますが、うまくいきませんでした。

于 2013-02-02T08:06:03.680 に答える
1

次のスニペットを試すことができます。

@costs = []
params[:ingredient_costs].each do |ingredient_cost|
  if ingredient_cost[:id].blank?
    cost = IngredientCost.create(ingredient_cost)
    @costs << cost
  else
    cost = IngredientCost.find(ingredient_cost[:id])
    cost.update_attributes(ingredient_cost)
    @costs << cost
  end
end

PS まだテストしていません。ただし、エラーのある編集ページを再レンダリングする場合、@costs 変数にはエラーのあるデータが含まれます。

于 2013-01-31T10:25:03.007 に答える