assign_attributes并稍后保存在循环中 - ruby​​ rails

时间:2014-11-24 22:43:28

标签: ruby-on-rails ruby ruby-on-rails-3.2

我希望assign_attribute表中的各行,然后将它们保存在一个循环中。所以这就是我想要做的事情,

player_arr = []
params[:player_types].each do |index,p_type_params|
  if p_type_params[:id]
    player_arr << @player_types.find(p_type_params[:id]).assign_attributes(p_type_params)
  end
end

稍后我希望在所有更新中以原子方式保存为事务,

ActiveRecord::Base.transaction do
   player_arr.each do |p_type|
     p_type.save
   end
end

但这似乎不起作用,因为p_type似乎是NilClass。我不明白为什么,因为当我做player_arr.length时,我得到一个正数。 此处的目标还是捕获第一个循环中的所有赋值错误,然后进行原子保存。当然,我可以保存在第一个循环中,但它只捕获第一个遇到的错误。任何指针都会非常有用

1 个答案:

答案 0 :(得分:1)

问题似乎是你在一行中做得太多了。

player_arr << @player_types.find(p_type_params[:id]).assign_attributes(p_type_params)

您要将assign_attributesnil)的返回值添加到player_arr数组中。

请改为:

player_arr = []
params[:player_types].each do |index,p_type_params|
  if p_type_params[:id]
    player = @player_types.find(p_type_params[:id])
    player.assign_attributes(p_type_params)
    player_arr << player
  end
end