2010-11-18 4 views
2

Ceci est, espérons un slam dunk pour un maven Rails:Rails 2: utiliser form_for pour construire une forme couvrant plusieurs objets de la même classe

J'ai une forme qui est censé itérer sur un ensemble de LineItems et de recueillir informations sur chacun. Je suis en train de faire form_for et fields_for pour créer les noms de champs appropriés et les paramètres pour donner mon contrôleur une chose de hachage params comme

params[:line_items] = { <line_item.id> => { :rma_reason => "some string", :rma_qty => 2 } } 

Ce que j'est:

<% form_for(@object) do |rma_form| %> 
    <% @order.line_items.each do |item| %> 
    .... 
    <% fields_for item do |item_f| %> 
     <%= item_f.text_area :rma_reason %> 
     <%= item_f.text_field :rma_qty, :value => item.quantity, :size=>3 %> 
    <% end %> 
    .... 
    <% end %> 
<% end %> 

Et le code HTML résultant ressemble (ce que vous attendez, je suppose):

<textarea id="line_item_id" name="line_item[id]"></textarea> 
<input id="line_item_rma_qty" name="line_item[rma_qty]" size="3" type="text" value="1" /> 

Cependant ce que je suis en train de faire (et faili Pour trouver une solution au-delà du retour aux balises HTML ad-hoc), les noms de champ sont indexés par line_item.id, par ex. line_item [1928] [rma_qty] par exemple. Cela permettrait à mon contrôleur d'itérer sur chaque ligne_item et de le mettre à jour avec les paramètres donnés.

  • ... peut-être dans une interface utilisateur pur REST, la forme doit être liée à une instance de LineItem, et la norme form_for fonctionnerait - mais l'utilisateur doit être en mesure de soumettre tous les changements à la fois avec une forme . C'est possible?

Répondre

0

les besoins fields_for à appeler à l'aide du formulaire principal et un paramètre de chaîne avec la magie [] s et un argument indiquant quelle instance doit être insérée dans le [] s

<% rma_form.fields_for "line_item[]", item do |item_f| %> 

maintenant mon tag ressemble à quelque chose comme

<input id="return_authorization_line_item_1070870205_rma_qty" name="return_authorization[line_item][1070870205][rma_qty]" size="3" type="text" value="1" /> 

qui est Peachy. Ce classic railscast est un bon field_for intro, et this comment explique l'effet de la parenthèse magique qui a fait ce que je voulais - à part ça, je n'ai pas pu trouver cette fonctionnalité documentée nulle part.

1

Lorsque vous imbrication des champs de formulaire, vous devez vous assurer que vous enchaînez les méthodes fields_for forment le générateur de formulaire approprié:

<% rma_form.fields_for :line_item, item do |item_f| %> 

en appelant seul fields_for, vous enfreignez la chaîne de form_for et ainsi les noms de champs incorrects.

+0

qui ne m'a pas obtenu le line_item.id dans les params, mais tu avais raison et ça m'a permis de trouver la façon dont fields_for fonctionne réellement - même si ça semble toujours très étrange parfois - merci! – sbeam

+0

@sbeam mon mauvais, il me manquait le premier param pour 'fields_for'. Je pense que l'utilisation de symboles pour les références de modèles dans ces aides est légèrement plus lisible. –

Questions connexes