2009-03-05 4 views
2

Ce problème m'a tué. J'ai joué avec les formes complexes de Ryan Bates, mais je n'arrive pas à comprendre mon problème. J'ai ce schéma:Rails Dynamic Multi Model Attributs de formulaire


Location has_many :targets 
Target has_many :target_classifications

Tous les emplacements sont indiqués sur la page. Un utilisateur peut créer dynamiquement une cible pour n'importe quel emplacement via jscript, qui ajoute ensuite une ligne de table sous l'emplacement 3 sélectionne (qui contient les classifications disponibles pour la cible) et une valeur cible. Vous pouvez créer n'importe quel nombre de cibles pour n'importe quel emplacement avant de cliquer sur Enregistrer.
J'utilise RJS pour rendre un target_partial, qui a ce code: J'utilise fields_for ainsi:



pour chaque sélectionner. Lorsque sumbmitted, je reçois ce hachage:

"new_targets"=> 
    {"7"=>[{"id"=>"13"}, {"id"=>"15"}, {"value"=>"67", "id"=>""}], 
    "4"=> 
    [{"id"=>"12"}, 
    {"id"=>"15"}, 
    {"value"=>"23", "id"=>""}, 
    {"id"=>"11"}, 
    {"id"=>"16"}, 
    {"value"=>"67", "id"=>""}]}, 

Ainsi, il sépare chaque cible par emplacement (« 7 » dans ce cas et « 4 »), mais ne se sépare pas chaque cible. Ce que je veux est ceci:

 
"new_targets"=> 
    {"7"=>[ 
      {"target"=>[{"id"=>"13"}, {"id"=>"15"}, {"tonnes"=>"67"}]} 
     ], 
    "4"=>[ 
      {"target"=>[{"id"=>"12"},{"id"=>"15"},{"tonnes"=>"23"]}, 
      {"target"=>[{"id"=>"11"},{"id"=>"16"},{"tonnes"=>"67"]} 
     ] 
    } 

ainsi je peux parcourir chaque cible pour chaque emplacement. Je n'arrive pas à ajouter une nouvelle [cible] accolade dans ma méthode field_for (elle explose), mais c'est ce que je veux faire. Des pensées?

Répondre

0

Ce genre de question est abordée ici:

http://wonderfullyflawed.com/2009/02/17/rails-forms-microformat/

Mais il semble être une solution 2.3 rails (pas une option pour moi). Au fond, je veux une forme comme ils ont affiché sur le site:

<input name="creator[widget_attributes][0][id]" /> 
<input name="creator[widget_attributes][0][name]" /> 
<input name="creator[widget_attributes][0][price]" /> 

<input name="creator[widget_attributes][1][id]" /> 
<input name="creator[widget_attributes][1][name]" /> 
<input name="creator[widget_attributes][1][price]" /> 

Juste une façon de créer un identifiant unique pour chaque cible (ou dans ce cas, un widget attribut) Je veux ajouter. Genre de dur étant donné qu'une nouvelle cible est ajoutée avec jscript. Je pense qu'il devrait y avoir un moyen pour que les rails le fassent automatiquement pour moi

1

Je ne sais pas si vous faites cela, mais vous devez spécifier une chaîne à la place de l'objet lorsque vous utilisez fields_for. Je ne peux pas voir les codes que vous avez dans votre partiel, donc je peux être loin. Quoi qu'il en soit, la façon dont je le fais est dans une aide:

def fields_for_target(target, &block) 
    prefix = target.new_record? ? 'new' : 'existing' 
    fields_for("location[#{prefix}_target_attributes][]", target, &block) 
end 
+0

@brad: Je ne suis pas sûr, mais je pense que ces "[]" dans fields_for feront ce que vous voulez – klew

-1

Facile. Rechercher accepts_nested_attributes_for. :)

+0

Comme je l'ai mentionné rails 2.3 n'est pas une option pour moi pour le moment. Donc ça ne marche pas – brad