class CartItemsController < ApplicationController
before_filter :initialize_cart, :check_not_signedin
def create
product = Product.find(params[:product_id])
kart = initialize_cart
qty = CartItem.select(:quantity).where(:cart_id => kart.id, :product_id => product.id)
if qty == 0
@item = CartItem.new(:cart_id => kart.id, :product_id => product.id, :quantity => qty+1)
if @item.save
flash[:success] = "Product added"
redirect_to category_products_path
end
else
if CartItem.where("cart_id = ? AND product_id = ?", kart.id, product.id).first.update_column(:quantity, qty+1)
flash[:success] = "Product updated"
redirect_to category_products_path
end
end
end
当我尝试运行此操作时,我收到以下错误消息 “无法将FixNum转换为数组” app / controllers / cart_items_controller.rb:17:在'create'
请帮忙!
答案 0 :(得分:3)
以下行应将ActiveRecord::Relation
返回qty
:
qty = CartItem.select(:quantity).where(:cart_id => kart.id, :product_id => product.id)
您应该使用qty.count
代替qty.count == 0
此外,您无法像ActiveRecord::Relation
这样添加1
:qty+1
。它会给你错误信息。
我不确定您要做什么,但我建议您使用debugger
gem来帮助您解决问题。按照此处的指南进行设置,设置非常简单:http://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debugger-gem
然后,在代码中放置debugger
:
product = Product.find(params[:product_id])
kart = initialize_cart
qty = CartItem.select(:quantity).where(:cart_id => kart.id, :product_id => product.id)
debugger # <---- here
if qty == 0
@item = CartItem.new(:cart_id => kart.id, :product_id => product.id, :quantity => qty+1)
if @item.save
然后你可以在调试器断点处停下来找到更多内容,你可以这样做:
qty.class
qty.count
# etc
此外,您可以运行rails console
进行测试。
答案 1 :(得分:1)
我猜测以下行返回一个数组:
CartItem.select(:quantity).where(:cart_id => kart.id, :product_id => product.id)
如果是这种情况,那么你不能简单地在这一行上添加+1:
if CartItem.where("cart_id = ? AND product_id = ?", kart.id, product.id).first.update_column(:quantity, qty+1)
如果不是这种情况,你能否指出错误信息中指出的第17行是哪一行。