2013-09-05 38 views
0

我有以下機務佈局如何在Ruby on Rails的創建嵌套形式

薄餅模型,創建可以由客戶訂購比薩餅的名單,也得到與訂單相關聯,所以指示哪些比薩餅已訂購。

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 

比薩餅和秩序之間的連接表,這種多對多的是一個有許多通過,而不是有屬於許多,因爲在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 

然後我有一個管理頁面來創建和關聯比薩和澆頭。

但我不知道

1.如何創建訂單形式。

用戶應該能夠添加一個比薩餅並選擇已創建的

請幫我這一個或多個澆頭。卡住了幾天

回答

2

它的一個老屏幕錄像Nested model form part 1由瑞安貝茨提出,但我希望它可以幫助你,也有這個截屏視頻的修訂版本。

+0

這是行不通的,瑞安正在創造新的問題和答案。我只想添加問題和答案,以創建一個訂單。 – carbonr

1

對不起,我遲到了回覆。

好的,還沒有測試過這個,但希望它能讓你明白。爲了它的工作,這個樣本依賴,

  1. simple_form
  2. 瑞安貝茨動態嵌套形式

還向我道歉,這個答案是缺乏的很大一部分,你需要在每次更改<%= f.association:pizzas%>值時重新呈現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>