【发布时间】: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