【问题标题】:Ruby On Rails 2.0.2: Update quantity value of a product after orderRuby On Rails 2.0.2:在订购后更新产品的数量值
【发布时间】:2011-08-02 23:55:25
【问题描述】:

我正在使用 Instant-Rails 2.0 并遵循使用 Rails 3rd edition 进行敏捷 Web 开发的 Depot 示例项目。

我的问题是:当客户下订单时,使用购物车和订单表格,我需要更新产品表的列数量。 一个例子:如果我有 10 本书(值“10”以产品的特定 id 存储在 products 表中)并且客户想要 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 的回答。解决方案是在成功订购后减少产品数量。这是store_controller.rb的方法save_order:

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

【问题讨论】:

  • 你为什么要在 2011 年学习 rails 2.0.2?如果这是你第一次接触 Rails,也许你应该考虑 Rails 3?
  • @codinguser 我必须在 rails 2.0.2 上做这个项目,因为老师在这个旧版本中解释了示例项目。我知道,听起来很奇怪。

标签: ruby-on-rails ruby


【解决方案1】:

您尝试通过数量来查找产品。 但“查找”需要一个主键

代替:

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

试试这个:

@quantity = product.quantity

更新:

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

【讨论】:

  • @ipsum 感谢您的建议,我在 store_controller.rb 的方法“add_to_cart”中编辑了该行。现在我在控制台中没有错误,但是,当我看到产品列表时,在确认订单后,产品的数量没有更新。也许我必须重写模型product.rb中的方法“self.remove_q(quantity)”?干杯
  • @ipsum 谢谢,我更新了方法,但我必须编辑行:"product.decrement!(:quantity, params[:quantity])" 因为 rails 在控制台上给我一个错误“ArgumentError(参数数量错误(每 1 个 2 个))递减!”。我以这种方式编辑了该行:“product.decrement!(:数量)”,似乎它有效!数量已更新。
  • @ipsum 我已经解决了这个问题。谢谢你。我有另一个问题。如果我的客户取消会话并想清空购物车,store_controller.rb 中有方法 empty_cart: def empty_cart session[:cart] = nil redirect_to_index end
  • @ipsum 如果我想解决相反的问题,我的意思是,当客户点击“清空购物车”按钮时,需要将数量恢复到原始值。我试图为此插入一个动作,但我对此表示怀疑。我如何从购物车中提取商品,然后将客户之前添加到购物车但现在取消的产品数量恢复到原始价值?感谢您的回答。干杯
  • 下单成功后最好减少数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2014-08-30
  • 2018-07-05
相关资源
最近更新 更多