所以我遇到一个问题,用户需要能够放置order
,每个订单都由一个或多个pizza_order
模型组成。 pizza_order
与pizza
模型具有多态关系,因为它可以指向specials
表中具有预定义浇头列表的条目,或者它可以指向pizzas
表中的一个条目,用户可以选择地壳类型和浇头。
我以前使用Cocoon gem解决了尝试在一个pizza_order
中创建多个order
条目的问题,这样可以正常工作。当每个pizza_order
仅与specials
表中的条目相关联时,它甚至可以正常工作。一旦我尝试将自定义披萨条目用于工作,就会开始破碎。
这是新order
的样子
<%= form_for @order do |f| %>
<%= f.fields_for :pizza_orders do |pi_order| %>
<%= render partial: 'pizza_order_fields', locals: {f: pi_order}%>
<% end%>
<div class="add-field">
<%= link_to_add_association 'Add Pizza', f, :pizza_orders, id: "add_btn", class: "btn btn-primary" %>
</div>
<br/>
<%= f.submit "Place Order", class: "btn btn-primary "%>
<% end %>
每当用户按下“添加比萨饼”时,这将呈现新的部分,以选择特色或定制比萨饼。那个表格看起来像这样
<div class="nested-fields">
<fieldset data-role="controlgroup" data-type="horizontal" class="form-inline">
<legend>Specialty Pizzas</legend>
<% @specials.each do |sp| %>
<div class="container">
<%= f.label :pizza_id, sp.get_name_and_cost %>
<%= f.radio_button :pizza_id, sp.id %>
<h5>Crust Type: <%= sp.pizza.crust.name %></h5>
<h5>Toppings:
<% sp.pizza.toppings.each do |top| %>
<%= top.name + (top == sp.pizza.toppings.last ? "" : ",") %>
<% end %>
</h5>
<hr/>
</div>
<% end %>
<div class="container">
<%= f.label "Custom" %>
<%= f.radio_button :pizza_id, "Custom", id: "custom_pizza" %>
<div id="custom_pizza_fields">
<%= f.fields_for :pizza_id do |pi| %>
<%= render partial: 'custom_pizza', locals: {pi: pi} %>
<% end %>
</div>
</div>
</fieldset>
<%= f.label :quantity %>
<%= f.number_field :quantity, class: "number_field" %>
<br/>
<%= link_to_remove_association "Delete", f , id: "delete_btn", class: "btn btn-primary" %>
<hr/>
最后,这将部分创建一个自定义披萨,看起来像这样
<h5>Crust Type</h5>
<table class="table">
<tr>
<% Crust.all.each do |crust| %>
<td>
<%= pi.label :crust, crust.name %>
<%= pi.radio_button :crust, crust.id %>
</td>
<% end %>
</tr>
</table>
<h5>Toppings</h5>
<table class="table">
<tr>
<% Topping.all.each do |topping| %>
<td>
<%= pi.label :toppings, topping.get_name_and_cost %>
<%= pi.check_box :toppings %>
</td>
<% end %>
</tr>
</table>
我很确定问题来自第2 fields_for
行,其中<%= f.fields_for :pizza_id do |pi| %>
行。:pizza_id
。与数据库中已存在的特色披萨不同,当用户下订单时,将创建自定义披萨。所以我认为Toppings
此时不会映射到任何内容。
另一个问题是如何返回has_many
的集合以映射到pizza
模型中的class Order < ActiveRecord::Base
belongs_to :user
has_many :pizza_orders
accepts_nested_attributes_for :pizza_orders
end
class PizzaOrder < ActiveRecord::Base
belongs_to :pizza, polymorphic: true
belongs_to :order
accepts_nested_attributes_for :pizza, allow_destroy: true
end
class Special < ActiveRecord::Base
belongs_to :pizza
validates :pizza, :presence => true
validates :cost, :presence => true
def get_name_and_cost
"#{pizza.name}: $#{cost}"
end
end
class Pizza < ActiveRecord::Base
has_and_belongs_to_many :toppings
has_many :pizza_orders, as: :pizza
belongs_to :crust
validates :crust, presence: true
end
class Topping < ActiveRecord::Base
has_and_belongs_to_many :pizzas
def get_name_and_cost
"#{self.name}: $#{self.cost}"
end
end
class Crust < ActiveRecord::Base
has_many :pizzas
end
字段?我已经实现了复选框,但我无法验证这是否会返回一个集合,因为我之前的问题暂时停止了进一步的进展。
供参考,以下是使用的模型。
def order_params
params.require(:order).permit(:cost, pizza_orders_attributes: [:quantity, pizza_attributes: [:crust, :toppings]])
end
最后一件事。这就是我计划处理订单的强类型参数的方法,但我不太确定它是否准确
await