У меня довольно стандартный прецедент. У меня есть родительский объект и список дочерних объектов. Я хочу иметь табличную форму, где я могу редактировать всех детей сразу, как строки в таблице. Я также хочу иметь возможность вставлять одну или несколько новых строк, а в submit их создавать в виде новых записей.
Когда я использую fields_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]
. Еще раз, Rack barfs.
Я в недоумении. Как я использую стандартные помощники Rails, такие как fields_for
для отправки нескольких новых записей вместе с существующими записями, чтобы они анализировались как массив в параметрах, и чтобы все записи, лишенные идентификаторов, были созданы как новые записи в БД? Мне повезло, и мне просто нужно сгенерировать все имена полей вручную?