我有一个非常标准的用例。我有一个父对象和一个子对象列表。我想要一个表格形式,我可以在其中一次编辑所有子项,作为表格中的行。我还希望能够插入一个或多个新行,并在提交时将它们创建为新记录。
当我使用 afields_for
为 has-many 相关的嵌套记录呈现一系列子表单时,rails 会生成字段名称,例如parent[children_attributes][0][fieldname]
,parent[children_attributes][1][fieldname]
等等。
这会导致 Rack 解析一个 params 哈希,如下所示:
{ "parent" => {
"children" => {
"0" => { ... },
"1" => { ... } } }
当传递一个新的(非持久化的)对象时,同样fields_for
会生成一个如下所示的字段名称:
parent[children_attributes][][fieldname]
请注意[]
其中没有索引。
这不能[0]
与包含,等的字段以相同的形式发布[1]
,因为 Rack 会感到困惑并引发
TypeError: expected Array (got Rack::Utils::KeySpaceConstrainedParams)
“好吧”,我想。“我会确保所有字段都使用[]
表单而不是[index]
表单。但我不知道如何说服fields_for
他们始终如一地这样做。即使我给它一个明确的字段名称前缀和对象:
fields_for 'parent[children_attributes][]', child do |f| ...
只要child
是持久化的,它就会自动修改字段名,使它们成为例如parent[children_attributes][0][fieldname]
,而将新记录的字段名保留为parent[children_attributes][][fieldname]
。再一次,机架呕吐。
我不知所措。我如何使用标准 Rails 助手fields_for
来提交多个新记录以及现有记录,将它们解析为参数中的数组,并将所有缺少 ID 的记录创建为数据库中的新记录?我运气不好,我只需要手动生成所有字段名称吗?