我已关注railscast #198 Edit Multiple Individually,它可以100%用于从单个表单中编辑多个记录。
但是,如果记录,我还想从同一表单创建新记录。即在控制器中从表单中评估params的哈希值,更新那些存在的记录并创建不存在的记录。
此外,如果发生任何验证错误,则应将其捕获并传回。
这在控制器中工作,如果新记录的字段不存在,将正确更新 @costs = IngredientCost.update(params [:ingredient_costs] .keys,params [:ingredient_costs] .values).reject {| item | item.errors.empty? }
对于新记录的字段,我目前正在创建一个画架大的唯一编号作为记录ID(我不确定这是否正确)然后消息回来说它无法保存因为id不存在,这是我不存在的预期。
我已经尝试了以下两个片段作为黑暗中的刺,但不确定我应该走哪条路。
@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"])
似乎都没有效果。
之前我见过这项工作,但是从一个表单更新/创建嵌套属性。我真的不想用这条路走。
答案 0 :(得分: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的答案看起来很划算,但我无法让它发挥作用。
答案 1 :(得分: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
P.S。我还没有测试过。但是对于使用错误重新呈现编辑页面,@costs变量的数据有错误(如果有的话)。