我有一个向导情况,我在其中创建一个Parent对象,然后构建一个包含2个嵌套子代的表单。
提交的参数如下所示:
Parameters: {"room"=>
{"parents_attributes"=>
{"0"=>{"name"=>"r2", "phone"=>"07443107986"},
"1"=>{"name"=>"", "phone"=>""}}},
"commit"=>"Go!", "id"=>"step03"}
(提交和id来自邪恶的向导步骤)
如果用户刷新页面,这些孩子的id会发生变化,参数如下所示:
Parameters: {"room"=>
{"parents_attributes"=>
{"1"=>{"name"=>"r2", "phone"=>"07443107986"},
"2"=>{"name"=>"", "phone"=>""}}},
"commit"=>"Go!", "id"=>"step03"}
因为id是由fields_for生成的。
我的控制器代码检索这样的数据(房间在上一步中保存在会话中):
@room = Room.find(session[:room_id])
@room.parents.build(room_params[:parents_attributes]['0'])
@room.parents.build(room_params[:parents_attributes]['1'])
这显然只有在用户不刷新页面时才有效。此外,如果验证激活,孩子的身份也会发生变化。
从params哈希中检索这些parent_attributes的更好方法是什么?
修改
在向导步骤中,子对象的构建如下:
when :step03
@room = Room.find(session[:room_id])
2.times{ @room.parents.build }
答案 0 :(得分:1)
您可以尝试以下方式动态提取哈希键:
room_params[:parents_attributes].each {|k,_| @room.parents.build(room_params[:parents_attributes][k])}