2012-08-03 4 views
6

Ich habe eine Seite, auf der Sie eine Rechnung erstellen. Es gibt einen separaten Abschnitt, in dem Sie Zahlungen zu Rechnungen hinzufügen können. Was ich tun möchte, ist die Möglichkeit, beim Erstellen einer Rechnung eine Zahlung zu erstellen.Rails Render Teil eines Formulars in einem anderen Formular

Ich möchte das Formular "Create Payment" VIEW in das Formular "Create Invoice" VIEW rendern. Wie kann ich das machen? Hier einige Code ist:

Rechnungsformularansicht (beachten Sie den Anruf machen):

<%= form_for(@contract) do |f| %> 
    <div class="field"> 
    f.label "Add payment?" 
    <div id="pay_form"> 
     <%= render 'payments/pay_form' %> 
    </div> 
</div> 

(_pay_form.html.erb) Die teilweise von der Zahlung Formular erstellen (bemerke ich bin nicht der form_for Tag einschließlich hier, weil ich in einer anderen Form auf der Rechnung Seite oben) nicht neben eine Form wollen:

<div class="field"> 
    <%= f.label 'Amount Paid:' %> 
    <%= f.text_field :amount %> 
</div> 
<div class="field"> 
    <%= f.label 'Payment Method' %> 
    <%= f.select :method, %w(Cash Credit Check) %> 
</div> 

das Hauptproblem ist die f Variable in der teilweise nicht existiert. Und selbst wenn ich die f Variable der Rechnung von ihrer Form zuweise, wären die Namen der Parameter params[:invoice][:amount] eher als params[:payment][:amount]. Siehst du, was ich sage?

Was ist der beste Weg, dies zu tun?

+0

Sie [accepts_nested_attributes_for] Haben überprüfen (http://api.rubyonrails.org/classes /ActiveRecord/NestedAttributes/ClassMethods.html) und [fields_for helper] (http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for)? –

Antwort

7

Sie müssen die Variable f von der Ansicht an die partielle übergeben.

Um dies zu tun,

<%= render 'payments/pay_form' %> 

in

<%= render 'payments/pay_form', f: f %> 

Sie Namen Fehler auftreten sollte sich ändern, da beide f

try benannt sind:

<%= render :partial => 'payments/pay_form', :locals => { :f => f} %> 

oder

<%= form_for(@contract) do |builder| %> 
    <div class="field"> 
    builder.label "Add payment?" 
    <div id="pay_form"> 
     <%= render 'payments/pay_form', f: builder %> 
    </div> 
</div> 

Hoffe das hilft.

Für weiteres Lernen, ich denke, was Sie wirklich suchen, ist verschachtelte Formen.

Hier sind einige gute Tutorials zu diesem Thema, wenn man über sie in das Lernen interessant sind:

http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2

+0

Danke für diese Antwort. Wegen der Art, wie ich es habe, sind die Zahlungen nicht direkt mit den Verträgen verbunden, so dass ich ursprünglich die Idee für access_nested_attributes_for ignoriert habe. Allerdings habe ich die fields_for helper komplett vergessen, was genau das war, was ich in der Lage war, die partielle (die Formbuilder vars 'f') zu verwenden, ohne ein anderes Formular innerhalb des ursprünglichen Formulars zu erstellen. Du hast mich auf den richtigen Weg geführt! –