【发布时间】:2012-07-12 06:02:57
【问题描述】:
我有一个非常标准的用例。我有一个父对象和一个子对象列表。我想要一个表格形式,我可以一次编辑所有子项,作为表格中的行。我还希望能够插入一个或多个 new 行,并在提交时将它们创建为新记录。
当我使用 fields_for 为 has-many 相关的嵌套记录呈现一系列子表单时,rails 会生成字段名称,例如parent[children_attributes][0][fieldname]、parent[children_attributes][1][fieldname] 等等。
这会导致 Rack 解析参数哈希,如下所示:
{ "parent" => {
"children" => {
"0" => { ... },
"1" => { ... } } }
当传递一个 new(非持久化)对象时,相同的 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]。再一次,Rack barfs。
我很茫然。我到底如何使用像fields_for 这样的标准 Rails 助手来提交多个 new 记录以及现有记录,将它们解析为参数中的数组,并让所有缺少 ID 的记录在数据库中创建为新记录?我运气不好,只需要手动生成所有字段名称吗?
【问题讨论】:
-
那么您对 fields_for 的调用是什么样的?
-
您使用的是哪个机架版本?它在以前的版本中也被破坏了吗?
-
不是最优雅的解决方案,但您可以使用
:child_index选项并为每条新记录传递一些随机索引。请参阅this 示例。这是关于在客户端为新记录添加字段,但您应该明白这一点。不过,奇怪的是它在服务器端对您不起作用。
标签: ruby-on-rails ruby-on-rails-3