在Rails 3中以单个形式更新和创建多个记录

时间:2013-01-31 09:37:08

标签: ruby-on-rails

我已关注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"])

似乎都没有效果。

之前我见过这项工作,但是从一个表单更新/创建嵌套属性。我真的不想用这条路走。

2 个答案:

答案 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变量的数据有错误(如果有的话)。