2013-07-10 2 views
2

У меня есть следующие соотношения:Добавление нескольких элементов в корзину, в то же время

Class CartItem 
belongs_to :cart 
belongs_to :product 

Class Product (<=> category) 
has_many :cart_items 


Class Cart 
has_many :cart_items 

Когда кто-то добавляет продукт в свою корзину, он создает строку в таблице CartItem с cart.id и продуктом. Я бы. Я могу добавить и удалить продукт в корзину на странице редактирования, он работает.

Но теперь я хотел бы добавить или удалить более одного товара в корзину в одно и то же время. Мне просто нужно ввести поле ввода, когда клиент может поместить номер, который мы хотим добавить/удалить. Однако мне не удается это сделать, потому что в форме редактирования, если я помещаю поле, называемое «число» (для каждого продукта), очевидно, появится ошибка, потому что нет атрибута «число». Возможно, я должен добавить «field_tag», но как он может работать? Заранее спасибо

ответ

5

Я работаю над камнем электронной коммерции, написанным с помощью Rails под названием Spree. Вот как мы решили эту проблему.

У нас есть 4 модели: Variant, Product, Order и LineItem. Они формируют основы нашей системы заказов. Вариант можно рассматривать как «мутацию» продукта. Скажем, у вас есть TShirt, который может появиться в Red, Green или Blue. Продукт представляет собой TShirt, в то время как цвета являются вариантами.

Варианты привязаны к Заказу посредством LineItems. Объект LineItem хранит: variant_id, quantity и текущую цену варианта, на случай если это изменится позже. Вы не хотите, чтобы цены неожиданно менялись на пользователей!

Логика добавления товара в корзину - это просто форма с полем variant_id и количеством на странице продукта. Here's Spree's version. Действие контроллера, который имеет дело с этой формой в основном принимает variant_id и количество, и делает это:

  1. Проверки, если заказ уже существует
  2. Если заказ не существует, создает один
  3. Создает новый позиции в заказе с указанным количеством и вариантом_ид и сохраняет цену.

Шведский вуду вокруг этого немного сложнее, поскольку мы заботимся об уровнях запасов и т. Д., Но это основная его суть.

Когда пользователь отправляется на просмотр своей тележки, мы представляем им форму со всеми позициями и числовым полем количества. Эта форма выглядит следующим образом:

checkout http://f.cl.ly/items/3P3t3o1F283a1e0Z3e0C/Screen%20Shot%202013-07-11%20at%208.39.20%20AM.png

Код для производства, что форма в трех файлах: orders/edit.html.erb, orders/_form.html.erb и orders/_line_item.html.erb

что форма произведения, подав OrdersController#update, и из-за полей в форма, являющаяся вложенными атрибутами, весь заказ и его позиции обновляются соответствующим образом.

Надеюсь, это поможет вам!

+0

Хорошая работа! Я нашел решение, вдохновленное вашим ответом – Julien