所以我对Rails相当新,我试图找出一种复杂形式的最佳生成方式。基本想法是,用户放置order
,每个order
由一个或多个pizza_order
组成,每个pizza_order
由special
披萨组成或只是一个pizza
。我现在面临的主要问题是如何生成动态表单,用户可以始终如一地生成任意数量的新pizza_order
模型?
我的想法是按下一个按钮,每次按下该按钮以呈现由新pizza_order
所需的字段组成的部分视图。当用户按下提交时,会生成order
,以及与该pizza_order
相关联的一组新order
模型。这些是我的模型到目前为止的样子。
顺序
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
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 Special < ActiveRecord::Base
belongs_to :pizza
validates :pizza, :presence => true
validates :cost, :presence => true
end
我完全失去了控制器和视图的样子,到目前为止,这是我视图的总体布局,我担心以后填写属性,我还有更多关注设置正确的rails字段。
<%= form_for @order do |t| %>
<%= t.fields_for t.pizza_orders do |po| %>
<% end%>
<!--Insert new pizza_orders after marker -->
<span id="marker"></span>
<%= button_tag "New Order", :type => 'button', :id => 'test' %>
<%= t.submit "Place Order" %>
<% end %>
答案 0 :(得分:2)
如果我正确理解你的困境,这是Cocoon的工作! Cocoon允许您生成动态嵌套字段(尽可能多)。
所以我要做的是:
观看this video你可以快进到他正在展示如何动态添加食谱成分的地方,但实际上这整个教程是一个很好的参考,可以为你节省大量的谷歌搜索。
然后在你的披萨订单视图中,渲染部分(就像你说的那样)只用茧做。
<%= simple_form_for @order do |t| %>
<%= t.simple_fields_for :pizza_orders do |po| %>
<%= render 'order_fields', p: po %>
<% end%>
<div class="add-field"><%= link_to_add_association 'Add Pizza Order', t, :pizza_orders %></div>
<!--Insert new pizza_orders after marker -->
<span id="marker"></span>
<%= button_tag "New Order", :type => 'button', :id => 'test' %>
<%= t.submit "Place Order" %>
<% end %>
然后创建部分_order_fields.html.erb
并输入您需要的任何字段,如下所示:
<div class="nested-fields">
<%= p.input :order_field1 %>
<%= p.input :order_field2 %>
<%= p.input :order_field3 %>
<%= link_to_remove_association "Delete", p %>
</div>
记得像任何其他筑巢一样做你强大的障碍,你应该全力以赴!还要确保父模型accepts_nested_attributes_for
是孩子,并允许将其销毁。
现在,关于代码的其余部分: 我想你可能会让你的模型过于复杂。虽然我不知道你所处理的领域我的直觉是你不必使用多态关联 我一眼就能看出来 两个,也许三个模型:
Order
会has_many :pizzas
关于外壳类型的数据,披萨的价格将保存在每个披萨的模型中。像这样:rails g model Pizza price:decimal crust:string type:string
。如果它是特殊的,请将类型设为“特殊”。
额外的模型关联会使您的代码变得混乱,妨碍您使用可用的工具并可能导致血压升高。比萨是生活中简单的乐趣之一,应该不受多态关联的影响;为了你自己,不要过于复杂。 :-D
您需要Simple Forms gem直接复制我上面的内容。 (我强烈推荐它。)请注意,您需要将form_for
更改为simple_form_for
,将fields_for
更改为simple_fields_for
。