Ruby on Rails:复杂的表单生成

时间:2015-10-27 22:24:51

标签: ruby-on-rails ruby nested-forms form-for

所以我对Rails相当新,我试图找出一种复杂形式的最佳生成方式。基本想法是,用户放置order,每个order由一个或多个pizza_order组成,每个pizza_orderspecial披萨组成或只是一个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 %>

1 个答案:

答案 0 :(得分:2)

如果我正确理解你的困境,这是Cocoon的工作! Cocoon允许您生成动态嵌套字段(尽可能多)。

所以我要做的是:

install the cocoon gem

观看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是孩子,并允许将其销毁。

现在,关于代码的其余部分: 我想你可能会让你的模型过于复杂。虽然我不知道你所处理的领域我的直觉是你不必使用多态关联 我一眼就能看出来 两个,也许三个模型:

  1. 顺序
  2. 披萨
  3. 浇头? (茧的另一种用途)
  4. Orderhas_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