2012-08-03 83 views
6

我有一個創建發票的頁面。有一個單獨的部分允許您向發票添加付款。我想要做的是添加創建發票時創建付款的功能。Rails在另一個表單中渲染表單的一部分

我想呈現「創建付款」窗體查看到「創建發票」窗體視圖。我怎樣才能做到這一點?下面是一些代碼:

發票表單視圖(注意渲染調用):

<%= 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)從創建付款形式的部分(請注意,我不包括的form_for標記這裏,是因爲我不想旁邊的發票頁面上的其他形式以上的內部形式):

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

的主要問題是f變量的部分不存在。即使我將Invoice的f var分配給它的形式,這些參數的名稱將是params[:invoice][:amount]而不是params[:payment][:amount]。看看我在說什麼?

要做到這一點,最好的方法是什麼?

+0

你檢查[accepts_nested_attributes_for](http://api.rubyonrails.org/classes /ActiveRecord/NestedAttributes/ClassMethods.html)和[fields_for helper](http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for)? – 2012-08-03 20:01:36

回答

7

您需要將f變量從視圖傳遞給partial。

要做到這一點,改變

<%= render 'payments/pay_form' %> 

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

如果您遇到名稱錯誤,因爲這兩個被命名爲f

嘗試:

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

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

希望這會有所幫助。

爲了進一步學習,我認爲你真正想要的是嵌套表單。

下面是對這個問題的一些好的教程,如果你在學習它們很有趣:

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

+0

感謝您的回覆。由於付款方式與合同沒有直接關聯,所以最初我忽略了對accept_nested_attributes_for的想法。然而,我完全忘了fields_for helper,這正是我需要能夠使用partial(使用formbuilder vars'f')而無需在原始表單內創建另一個表單的方法。你引導我走向正確的道路! – 2012-08-03 21:24:38

相關問題