2016-08-12 5 views
0

Ich versuche simple_form für ein Produkt/Cart-Szenario einzurichten, aber ein wenig anders als das typische Szenario. Mein Display muss ALLE verfügbaren Produkte auflisten und für jeden eine Menge eingeben. Beim Speichern sollten die cart_items cart_id, product_id und qty nur für die Artikel speichern, für die eine Menge angegeben ist.Rails Simple Form Association für alle möglichen Objekte

class Cart < ApplicationRecord 
    has_many :cart_items 
    has_many :products, through: :cart_items 
    accepts_nested_attributes_for :cart_items 
end 

Warenkorb Artikel:

class CartItem < ApplicationRecord 
    belongs_to :cart 
    belongs_to :product 
end 

Produkte: Wenn es leer oder Null ist, sollte es nicht zu cart_items

Warenkorb hinzugefügt werden

class Products < ApplicationRecord 
    has_many :cart_items 
    has_many :carts, through: :cart_items 
end 

Ich versuche, meine Form Anzeige zu haben, wie zum Beispiel: [ x ] (Qty) Product Name [ x ] (Qty) Product Name [ x ] (Qty) Product Name [ x ] (Qty) Product Name

Ich bin nicht sicher, wie das zusätzliche Feld für die Menge f.association :cart_items, collection: Products.all() mit bekommen, und ich versuchte, diese:

<%= f.simple_fields_for :cart_items do |fa| %> 
    <%= fa.association :product, as: :select %> 
    <%= fa.input :qty %> 
<% end %> 

Aber die zeigt nur vorhandene Verknüpfungen an und zeigt das Produkt in einer Auswahlliste an, während ich nur alle Produkte auflisten und deren zugehörige Menge anzeigen möchte.

Gibt es eine nette und schöne "Rails-y" -Methode, die ich übersehen habe, oder muss ich mehr manuelle Manipulation in meinem Controller und in meinen Ansichten vornehmen? Ich benutze Schienen 5.

Antwort

1

Ich vermute, dass es keine spezielle "Rails-y" Art und Weise, oder ich bin mir dessen nicht bewusst. Ich denke, dass Sie alle Ihre Produkte durchlaufen müssen und cart_items für die fehlenden vor dem Tag simple_fields_for erstellen müssen. Wenn ein Einkaufswagenartikel mit einem Produkt bereits vorhanden ist, zeigen Sie es einfach an; Ansonsten baue es zuerst und zeige es dann.

Sie müssen auch die Ablehnung von cart_items im Falle fehlender Menge hinzufügen. Etwas wie dieses:

accepts_nested_attributes_for :cart_items, reject_if: lambda { |ci| ci[:qty].blank? || ci[:qty].zero? } 

Dies sollte den Trick tun.

+0

Danke - das macht Sinn! (vorherige Seite Frage entfernt hier, wie ich die Antwort durch googeln gefunden) – Ryan

Verwandte Themen