在视图中使用选择Rails多对多模型

时间:2016-07-22 00:07:52

标签: ruby-on-rails ruby forms

练习中的逻辑是创建一个Bill,其中Bill有一个包含产品数量的产品列表。

我有接下来的3个型号:

  • 比尔
  • 产品
  • BillItem(这是比尔和产品之间的多对多关系的中间模型)

架构更清晰:

create_table "bill_items", force: :cascade do |t|
  t.integer  "amount"
  t.integer  "product_id"
  t.integer  "bill_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["bill_id"], name: "index_bill_items_on_bill_id"
  t.index ["product_id"], name: "index_bill_items_on_product_id"
end

create_table "bills", force: :cascade do |t|
  t.string   "user_name"
  t.string   "dni"
  t.date     "expiration"
  t.float    "sub_total"
  t.float    "grand_total"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end

create_table "products", force: :cascade do |t|
  t.string   "name"
  t.string   "description"
  t.float    "price"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
end

首先,我在我的数据库中有一个已创建产品的列表。 对于我的BillController,我有一个_form.html.erb,我希望能够创建动态选择以选择产品并设置金额。

我的观点是下一个:

<%= form_for bill do |f| %>
  <div>
    <%= f.label :user_name %>
    <%= f.text_field :user_name %>
  </div>

  <div>
    <%= f.label :dni %>
    <%= f.text_field :dni %>
  </div>

  <div>
    <%= f.label :product %>
    <%= f.collection_select :product_ids, Product.all, :id, :name %>
  </div>
  # Here i should add more selects if the user want to add more products.

  <div><%= f.submit %></div>
<% end %>

我的问题或我的问题是:如何“集中”产品的ID及其数量。另一个问题是,我可以用JS动态创建其他选择吗?

1 个答案:

答案 0 :(得分:1)

您需要在表单中添加多个BillItem以说明金额和产品。这是通过模型上的accepts_nested_attributes_for完成的。例如:

class Bill < ActiveRecord::Base
  has_many :bill_items
  accepts_nested_attributes_for :bill_items
end

在控制器的BillItem上初始化Bill

class BillsController < ActionController::Base
  def new
    @bill = Bill.new
    @bill.bill_items.build
  end
end

然后在表单中,使用fields_for帮助程序创建子表单:

<%= form_for @bill do |f| %>
  <div>
    <%= f.label :user_name %>
    <%= f.text_field :user_name %>
  </div>
  <div>
    <%= f.label :dni %>
    <%= f.text_field :dni %>
  </div>

  <%= f.fields_for :bill_items do |f| %>
    <div>
      <%= f.label :product %>
      <%= f.collection_select :product_id, Product.all, :id, :name %>
    </div>
    <div>
      <%= f.label :amount %>
      <%= f.number_field :amount %>
    </div>
  <% end %>
  <%= f.submit %></div>
<% end %>

是的,你可以use javascript to create new nested forms