Ruby On Rails 2.0.2: обновление количества товара после заказа - PullRequest
0 голосов
/ 11 апреля 2011

Я использую 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

1 Ответ

3 голосов
/ 11 апреля 2011

Вы пытаетесь найти товар по количеству. но «find» ожидает первичный ключ

Вместо:

@quantity = Product.find(params[:quantity])

попробуйте это:

@quantity = product.quantity

UPDATE:

def add_to_cart
    product = Product.find(params[:id])
    @cart = find_cart
    @current_item = @cart.add_product(product)
    product.decrement!(:quantity, params[: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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...