Rails在另一个表单中渲染表单的一部分

时间:2012-08-03 19:51:10

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我有一个页面,您可以在其中创建发票。有一个单独的部分允许您向发票添加付款。我想要做的是添加创建发票时创建付款的功能。

我想将“创建付款”表单VIEW呈现为“创建发票”表单VIEW。我怎样才能做到这一点?这是一些代码:

发票表单视图(注意渲染调用):

<%= 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标记,因为我不想在上面的“发票”页面上的另一个表单中找到下一个表单):< / p>

<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]。看看我在说什么?

这样做最好的方法是什么?

1 个答案:

答案 0 :(得分:7)

您需要将f变量从视图传递到部分。

要执行此操作,请更改

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

相关问题