2

我遵循railscast #198 Edit Multiple Individually,它可以 100% 地从一个表单中编辑多个记录。

但是,如果记录,我还想从同一表单创建新记录。即在控制器中评估表单中参数的哈希值,更新那些存在的记录并创建不存在的记录。

此外,如果发生任何验证错误,则应将其捕获并传回。

如果新记录的字段不存在,控制器中的此功能将正确更新 @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"])

两者似乎都不起作用。

我以前见过这项工作,但用于从一种形式更新/创建嵌套属性。我真的不想走这条路。

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 回答