Я использую Instant-Rails 2.0 и следую примеру проекта Depot Agile Web Development с Rails 3-е издание.
У меня такой вопрос: когда клиент делает заказ, с корзиной и формой заказа, мне нужно обновить столбец количества продуктов таблицы.
Пример: если у меня есть 10 книг (значение «10» хранится в таблице продуктов с определенным идентификатором продукта), и клиент хочет 2 книги, после заказа я хочу, чтобы мой проект обновил количественное значение доступных книг, уменьшите его до 8 книг.
Я пытался добавить это в store_controller.rb
, в методе add_to_cart:
def add_to_cart
product = Product.find(params[:id])
@quantity = Product.find(params[:quantity])
@cart = find_cart
@current_item = @cart.add_product(product)
@removed = Product.remove_q(@quantity)
respond_to do |format|
format.js if request.xhr?
format.html {redirect_to_index}
end
rescue ActiveRecord::RecordNotFound
logger.error("Product not found #{params[:id]}")
redirect_to_index("invalid product!")
end
Где remove_q
- метод модели product.rb
:
def self.remove_q(quantity)
@quantity = quantity - 1
end
RoR выдает мне ошибку «продукт не найден» в консоли, когда я нажимаю кнопку «добавить в корзину». Что я делаю не так?
ОБНОВЛЕНИЕ: Спасибо ipsum за ответ. Решение заключается в уменьшении количества продуктов после успешного заказа. Это метод save_order
из store_controller.rb
:
def save_order
@cart = find_cart
@order = Order.new(params[:order])
@order.add_line_items_from_cart(@cart)
@recipient = 'email@notify.com'
@subject = 'Order'
email = Emailer.create_confirm(@order, @recipient, @subject)
email.set_content_type("text/html")
@cliente = sent
if @order.save
Emailer.deliver(email)
return if request.xhr?
session[:cart] = nil
redirect_to_index("Thank you")
else
render :action => 'checkout'
end
конец
Обратите внимание, что Emailer
- это модель для уведомления по электронной почте после успешного заказа, корзина сделана из множества line_items, которые являются продуктами, которые клиент добавляет в корзину. Как я могу уменьшить количество товаров в корзине после успешного заказа? Как я могу извлечь продукты из корзины?
Есть модель cart.rb
:
class Cart
attr_reader :items
def initialize
@items = []
end
def add_product(product)
current_item = @items.find {|item| item.product == product}
if current_item
current_item.increment_quantity
else
current_item = CartItem.new(product)
@items << current_item
end
current_item
end
def total_price
@items.sum { |item| item.price}
end
def total_items
@items.sum { |item| item.quantity }
end
end
и модель line_item.rb
:
class LineItem < ActiveRecord::Base
belongs_to :order
belongs_to :product
def self.from_cart_item(cart_item)
li = self.new
li.product = cart_item.product
li.quantity = cart_item.quantity
li.total_price = cart_item.price
li
end
end