2010-11-18 8 views
2

Dies ist hoffentlich ein Slam Dunk für eine Rails Maven:Rails 2: verwenden form_for eine Form des für mehrere Objekte der gleichen Klasse zu bauen

Ich habe eine Form, die eine Reihe von LineItems iterieren sollte und sammeln Informationen zu jedem. Ich versuche, form_for zu bekommen und fields_for die richtigen Feldnamen und Parameter zu erstellen meinem Controller ein params-Hash so etwas wie

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

zu geben, was ich habe, ist:

<% 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 %> 

und das resultierende HTML aussieht (was man erwarten würde, glaube ich):

<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" /> 

jedoch, was ich versuche (und faili zu bekommen ng, um eine Lösung zu finden, die über die Ad-hoc-HTML-Tags hinausgeht) sind Feldnamen, die durch line_item.id, z.B. line_item [1928] [rma_qty] zum Beispiel. Dies würde meinem Controller erlauben, über jedes line_item zu iterieren und es mit den gegebenen Parametern zu aktualisieren.

  • ... vielleicht in einem reinen REST UI sollte die Form auf eine Instanz von LineItem gebunden werden, und die Standard-form_for funktionieren würde - aber sollte der Benutzer alle Änderungen auf einmal mit einer Form einreichen können, . Ist es möglich?

Antwort

0

die fields_for Bedürfnisse auf dem Hauptformular Helfer genannt werden, und ein String-Parameter mit Magie [] s und ein Argument, das anzeigt, welche Instanz sollte etwas in der [] s

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

so jetzt mein Tag sieht eingefügt werden wie

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

das ist peachy.

diese classic railscast ist ein gutes fields_for Intro, und this comment erklärt die Wirkung der magischen Klammer, die getan hat, was ich wollte - anders als das, konnte dieses Feature nirgendwo dokumentiert finden.

1

Wenn Sie Formularfelder sind verschachteln, müssen Sie sicher, dass Sie die fields_for Methoden die entsprechenden Formular-Builder bilden, sind Verkettungs machen:

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

von fields_for allein nennen, das Sie brechen die Kette von form_for und damit die falschen Feldnamen.

+0

das brachte mir nicht die line_item.id in den params, aber du hattest recht und es bringt mich auf die Straße herauszufinden, wie fields_for tatsächlich funktioniert - obwohl es manchmal immer noch sehr seltsam scheint - danke! – sbeam

+0

@Strahl meine schlechte, mir fehlte der erste Parameter für 'fields_for'. Ich denke, die Verwendung von Symbolen für Modellreferenzen in diesen Helfern ist etwas besser lesbar. –

Verwandte Themen