Rails:如何以嵌套形式检索子对象的参数

时间:2016-04-08 12:15:55

标签: ruby-on-rails nested-forms params

我有一个向导情况,我在其中创建一个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 }

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方式动态提取哈希键:

room_params[:parents_attributes].each {|k,_| @room.parents.build(room_params[:parents_attributes][k])}