【问题标题】:Rails Render part of a form inside another formRails 在另一个表单中渲染表单的一部分
【发布时间】:2012-08-03 19:51:09
【问题描述】:

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

我想将“创建付款”表单 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 标记,因为我不想在上面的发票页面上的另一个表单中下一个表单):

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

最好的方法是什么?

【问题讨论】:

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


【解决方案1】:

您需要将 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

【讨论】:

  • 感谢您的回复。由于我的方式,付款与合同没有直接关联,所以最初我忽略了accepts_nested_attributes_for 的想法。但是,我完全忘记了 fields_for 助手,这正是我需要能够使用部分(使用 formbuilder vars f)而不在原始表单中创建另一个表单。你带领我走上了正确的道路!
猜你喜欢
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2011-10-30
  • 2017-05-03
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多