练习中的逻辑是创建一个Bill,其中Bill有一个包含产品数量的产品列表。
我有接下来的3个型号:
架构更清晰:
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动态创建其他选择吗?
答案 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 %>