我有一个Product
模型,一个Order
和一个OrderItem
模型。OrderItem
对象具有单个Product
(即,它belongs to
产品)
一个Order
有多个订单项目。
当您想向订单添加OrderItem
时,请填写表单。其中一个字段是输入将分配给此订单项的产品。订单模型将product_id
存储为外键,因此当我编写时 Rails 会抱怨(应该如此)
<%= form_for @orderItem, url: {:action => :create} do |f| %>
<p>
<%= f.label :product_name %>
<%= f.text_field :product_name %>
</p>
<%= f.submit %>
<% end %>
我想到的是让某人使用该表单来创建订单项。当他们选择要分配给此订单项的产品时,他们将从产品名称列表中选择一个名称(唯一),然后在提交表单时,控制器检索相应的Product
对象并将其 ID 分配给OrderItem
。
如何设置表单来实现此目的?
听起来你想使用嵌套属性。它们允许您从单个表单同时保存有关OrderItem
和Product
的信息。
在OrderItem
中添加行accepts_nested_attributes_for :product
。
然后在您的表单中,您需要类似以下内容:
<%= form_for @orderItem, url: {:action => :create} do |f| %>
<p>
<%= fields_for :product do |fp| %>
<%= fp.label :product_name %>
<%= fp.text_field :product_name %>
<% end %>
</p>
<%= f.submit %>
<% end %>
(请注意,在fields_for
块中使用fp.label
而不是f.label
。
以上是记忆中的,所以可能会有一些错误(你可能也需要改变你的OrderItemsController
),但它应该给你一个起点。
你可能会发现这个Railscast也很有帮助。