如何在Rails表单中动态添加(HABTM)collection_select +关联的text_field?

时间:2014-03-21 11:41:27

标签: ruby-on-rails forms dynamic has-and-belongs-to-many collection-select

对于rails中的个人发票应用,我可以对以下内容使用一些建议:在新的发票表单中,如何动态添加由products的collection_select和{{1}的关联text_field组成的新行点击amount

由于一张发票有很多产品且产品有很多发票,我认为这是一种HABTM关系。因此,我创建了表add new productinvoices及其连接表products

我希望invoices_products页面有一个表单,用户可以使用collection_select来挑选产品(所有产品都已预先加载到invoices/new表中)并填写金额它背后的文字字段。 用户应该能够通过点击products来复制这两个字段(collection_select和text_field),例如add new product

现在我该怎么做呢?我会在RailsCast #403 Dynamic Forms 04:50 text_field中放置哪个表格,因为每张发票有多个产品,因此有多个金额?

非常感谢正确方向的任何答案!

1 个答案:

答案 0 :(得分:0)

这取决于您想要的其他字段数

可以找到一个很好的教程here


<强>的Ajax

正确的方法是使用Ajax动态添加元素

这很棘手,因为这意味着您不会为动态添加的项目提供form_builder对象。无论如何,您仍然可以使用此代码执行此操作:

#config/routes.rb
get "new_field_path", to: "invoices#new_item"

#app/views/controller/index.html.erb
<%= ... form %>
<%= link_to "Add Field", new_field_path, remote: :true %>

<强>控制器

#app/controllers/invoices_controller.rb
def new_item
   @invoice = Invoice.new
   @invoice.products.build
   render "new_item", layout: false
end

#app/views/invoices/new_item.html.erb
<%= form_for @invoice do |f| %>
    <%= render partial: "products_fields", locals: { f: f } %>
<% end %>

#app/views/invoices/_products_fields.html.erb
<%= f.fields_for :products, child_index: Time.now.to_i do |p| %>
    <%= p.text_field :name %>
<% end %>

<强>表格

#app/views/invoices/new.html.erb
<%= form_for @invoice do |f| %>
   <%= render partial: "products_fields", locals: { f: f } %>
   <%= link_to "Add Field", new_field_path, remote: :true %>
   <%= f.submit %>
<% end %>