讓我們考慮一下Rails中多對多模型的經典實現。Rails嵌套形式多對多特例
class Order
has_many :order_products
has_many :products, through: order_products
accepts_nested_attributes_for :order_products
end
class Product
has_many :order_products
has_many :orders, through: order_products
end
class OrderProduct
belongs_to :order
belongs_to :product
accepts_nested_attributes_for :products
end
<%= form_for(@order) do |f| %>
<% f.fields_for :order_products do |op|%>
<%= op.label :amount %><br>
<%= op.text_field :amount %>
<% op.fields_for :product do |p|%>
<%= p.label :name %><br>
<%= p.text_field :name %>
<% end %>
<% end %>
的問題是在我來說,我有一個完整的固定表產品,與預定義的產品。我需要顯示所有產品列表創建/編輯視圖訂單和用戶應該設置他需要的每個產品的數量,沒有辦法添加額外的產品。 order_products是一個連接表。
在經典的例子,用戶自己可以添加/刪除產品產品表,在我的情況下,他只能從預定義的選擇需要的產品,他的選擇應該記錄在order_products表。
上面的代碼是給出的經典案例,我不知道如何適合它到我的情況。
我將不勝感激您的幫助。
附錄: 以下是代碼,我現在所擁有的
<%= form_<%= form_for(@order) do |f| %>
<% f.fields_for :order_products do |op|%>
<%= op.label :amount %><br>
<%= op.text_field :amount %>
<%= op.label :product_id, "Product" %>
<%= op.select :product_id, Product.all.collect { |p| [p.name, p.id] } %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我不得不添加以下代碼命令控制器,以便創造所有非icluded產品0量訂購,所有這些都在形式上。這不是最好的方法,你知道如何正確地做到這一點嗎?
Product.all.each { |p| order.orderproducts.push(OrderProduct.new(:product_id => p.id,:order_id => 1, :amount => 0)) if [email protected]?{|b| b.product_id == p.id}}
非常感謝您的回答,我已將當前代碼添加到問題的附錄中。問題是我無法得到它的工作,它與'意想不到的keyword_ensure,期待$結束'失敗。我做錯了什麼? – user10756
你有兩個'<% end %>'語句來關閉你的表單。 – Shadwell
對,謝謝,我已經在附錄中對它進行了修改,但是現在我有一些不同的*未定義的局部變量或方法'form_'for *。 – user10756