J'ai un assez standard de cas d'utilisation. J'ai un parent de l'objet et une liste des objets enfants. Je veux avoir la forme de tableaux où je peux modifier tous les enfants à la fois, comme les lignes de la table. Je veux aussi être capable d'insérer une ou plusieurs nouvelles lignes, et à soumettre les avoir être créés en tant que de nouveaux enregistrements.
Lorsque j'utilise un fields_for
de rendre une série de sous-formulaires pour les sous dossiers liés par a-beaucoup, rails génère des noms de champ, par exemple, parent[children_attributes][0][fieldname]
, parent[children_attributes][1][fieldname]
et ainsi de suite.
Cela provoque grille pour analyser un params de hachage qui ressemble à ceci:
{ "parent" => {
"children" => {
"0" => { ... },
"1" => { ... } } }
Quand a adopté une nouvelle (non persistants) de l'objet, le même fields_for
va générer un nom de champ qui ressemble à:
parent[children_attributes][][fieldname]
Remarque l' []
sans index.
Ce ne peut pas être affiché dans le même formulaire avec les champs contenant [0]
, [1]
, etc. parce Rack devient confus et pose
TypeError: expected Array (got Rack::Utils::KeySpaceConstrainedParams)
"OK", se dit I. "je vais juste assurez-vous que tous les champs de l'utilisation de l' []
formulaire au lieu de l' [index]
formulaire. Mais je ne peux pas comprendre comment convaincre fields_for
à le faire de manière cohérente. Même si je donne explicitement le champ préfixe de nom et d'objet:
fields_for 'parent[children_attributes][]', child do |f| ...
Tant que child
est persistant, il va automatiquement modifier le fieldnames, afin qu'ils deviennent par exemple, parent[children_attributes][0][fieldname]
, tout en laissant fieldnames pour les nouveaux enregistrements parent[children_attributes][][fieldname]
. Une fois de plus, Rack barfs.
Je suis à une perte. Comment diable puis-je utiliser les Rails aides comme fields_for
présenter plusieurs nouveaux dossiers, ainsi que des enregistrements existants, demandez-leur d'être analysée comme un tableau dans les paramètres, et de tous les enregistrements de défaut Id être créés en tant que de nouveaux enregistrements dans la base de données? Je suis hors de la chance et je n'ai qu'à générer tous les noms de champ manuellement?