在我当前的应用程序中,我执行更新PUTS,它更新表中多行的某些属性,并在同一个表中创建新记录。我的控制器代码片段如下所示:
def update
params[:p_types].values.each do |p_type_params|
if p_type_params[:player_id]
PlayerType.find(p_type_params[:player_id]).update_attributes p_type_params
else
@new_player_type = PlayerType.new(p_type_params)
@new_player_type.save
end
end
redirect_to action: "index"
end
现在,如果流程顺利进行,它会正常工作,它会更新,创建并重定向回索引,从而从更新的表中获取值。但是,我不想要部分更新或行创建。如果由于某些参数约束导致更新失败或创建,则表中没有任何操作,并重定向到之前的索引。我相信解决方案是将所有内容组合为一个事务,检查参数完整性,然后更新表。我无法找到更新或创建的具体示例,我尝试here但不是很清楚。对解决方案的任何帮助都会非常有用!
答案 0 :(得分:1)
虽然,有点难以理解你的要求是什么,但据我所知,这就是你想要的,
在Rails 3中 - PlayerType.find_or_initialize_by(id: p_type_params[:player_id])
在rails 4中 - PlayerType.where(id: p_type_params[:player_id]).first_or_initialize
上述代码将在表格中找到或初始化新记录,
注意:您也可以使用find_or_create_by
但这会创建对象而不是初始化它。希望有所帮助