私は Rails で書かれたSpreeという e コマースの gem に取り組んでいます。これが私たちがその問題をどのように解決したかです。
Variant
、Product
、 の4 つのモデルがOrder
ありLineItem
ます。これらは、当社の注文システムの基本を形成します。バリアントは、製品の「変異」のようなものと見なすことができます。赤、緑、または青の T シャツがあるとします。製品は T シャツで、色はバリエーションです。
バリアントは、LineItem を介して Order にリンクされます。LineItem オブジェクトには、 a variant_id
、 a 、quantity
および後で変更された場合に備えて、バリアントの現在の価格が格納されます。ユーザーの価格が予期せず変更されることは望ましくありません。
商品をカートに追加するためのロジックは、単に、商品のページに variant_id と数量フィールドを含むフォームです。これが Spree のバージョンです。そのフォームを処理するコントローラーのアクションは、基本的に variant_id と数量を受け取り、これを行います。
- 注文がすでに存在するかどうかを確認します
- オーダーが存在しない場合は作成します
- 指定された数量と variant_id を使用して注文に新しい品目を作成し、価格を保存します。
これに関する Spree のブードゥー教は、在庫レベルなどを考慮しているため、もう少し複雑ですが、それが基本的な要点です。
ユーザーがカートを表示すると、すべての項目と数量の数値フィールドを含むフォームが表示されます。そのフォームは次のようになります。

そのフォームを作成するコードは、 、 、および の 3 つのファイルorders/edit.html.erb
にorders/_form.html.erb
あります。orders/_line_item.html.erb
このフォームは に送信することOrdersController#update
で機能し、フォーム内のフィールドがネストされた属性であるため、注文全体とその項目が適切に更新されます。
これがお役に立てば幸いです。