【问题标题】:How to create nested form in Ruby on Rails?如何在 Ruby on Rails 中创建嵌套表单?
【发布时间】:2013-09-05 16:05:14
【问题描述】:

我有以下安排

Pizza 模型用于创建可由客户订购的比萨饼列表,它还与订单相关联,以指示已订购的比萨饼。

class Pizza < ActiveRecord::Base  
  has_many :pizza_orders
  has_many :orders, :through => :pizza_orders
  has_and_belongs_to_many :toppings
end

选项模型,用于创建可与某些比萨饼相关联的选项列表,还与每个比萨饼订单的连接表相关联,以指定哪个比萨饼订购了浇头。

class Topping < ActiveRecord::Base
  has_and_belongs_to_many :pizzas
  has_and_belongs_to_many :pizza_orders
end

披萨和配料的连接表,这是必需的,因为没有它,您无法指定哪些配料可以或不能与披萨一起订购。毕竟,在素食比萨饼中添加意大利辣香肠配料可能会冒犯某人。

class PizzasToppings < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :topping
end

订单模型,这只是将所有连接表放在一起。

class Order < ActiveRecord::Base
  has_many :pizza_orders
  has_many :pizzas, :through => :pizza_orders
end

pizza 和 order 之间的连接表,这个多对多是一个 has many through,而不是一个 has 和属于 many,因为在 Rails 中你不能直接操作 HBATM 连接表(据我尝试过),而你由于选项关系需要能够。

class PizzaOrder < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :order

  has_and_belongs_to_many :toppings
end

用于指示已为订单中的特定比萨饼选择了哪些浇头的连接表。

class PizzaOrdersToppings < ActiveRecord::Base
  belongs_to :pizza_orders
  belongs_to :topping
end

然后我有一个管理页面来创建和关联比萨饼和浇头。

但我不知道如何创建订单表格。用户应该能够添加披萨并选择一个或多个已创建的浇头

【问题讨论】:

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


    【解决方案1】:

    这是 ryan bates 制作的有点旧的截屏视频Nested model form part 1,但我希望它对你有所帮助,还有这个截屏视频的修订版。

    【讨论】:

    • 这行不通,ryan 正在创建新的问题和答案。我只想为未创建的订单添加问题和答案。
    【解决方案2】:

    对不起,我迟到了。

    好的,尚未对此进行测试,但希望它能让您有所了解。为了使其正常工作,此示例依赖于,

    1. simple_form
    2. ryan bates 动态嵌套表单

    我不得不道歉,这个答案缺少很大一部分,每次更改 值时都需要重新渲染 link_to_add_fields 部分,以便隐藏字段包含配料与已选择的披萨相匹配。

    很抱歉,我无法让您完全通过,但我希望这能为您指明正确的方向。

    _form.html.erb

    <%= simple_form @order do |f| %>
    
      <%= f.simple_fields_for :pizza_orders do |pizza_orders_fields| %>
        <%= f.association :pizzas %>
        <%= render partial: "pizza_order_fields", locals: {f: pizza_orders_fields}%>
        <%= link_to_add_fields "Add", f, :pizza_orders %>
      <% end %>
    <% end %>
    

    pizza_order_fields.html.erb 看起来像

    <fieldset>
      <%= f.hidden_field :_destroy %>
      <%= link_to "Delete", '#', class: "remove_fields btn btn-danger" %>
      <%= f.association toppings_pizza_orders, collection: f.object.pizza.toppings %>
    </fieldset>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多