Rails 购物车 Return 销毁的产品数量
Rails Cart Return Product Quantities on Destroy
我是 rails 的新手,有一个简单的产品商店网站。当用户将产品添加到他们的购物车或更新购物车中的 line_item 数量时,它将根据需要从基础产品数量中 add/remove。但是,当他们清空购物车(delete/destroy 购物车)时,它不会恢复基本产品数量,就好像他们没有购买任何东西一样。如何将销毁方法更新为 return 列出的 line_item 回到原始产品数量?
line_items_controller.rb - 完全清空购物车中的一种产品 line_item 并增加基本产品数量的示例方法:
def empty
product = Product.find(params[:product_id])
@line_item = @cart.empty_product(product)
@total = @line_item.quantity
product.increment!(:quantity, @total)
respond_to do |format|
if @line_item.save
format.html { redirect_to :back, notice: 'Product removed.' }
format.js
format.json { render :show, status: :ok, location: @line_item }
else
format.html { render :edit }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
carts/show.html.erb - 调用 destroy/empty 购物车:
<%= link_to 'Empty Cart', @cart, method: :delete, data: {confirm: 'Are you sure you want to empty your cart?'}, :class => 'btn btn-danger whiteText' %>
carts_controller.rb - 当前销毁购物车的方法:
def destroy
@cart.destroy if @cart.id == session[:cart_id]
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was emptied.' }
format.json { head :no_content }
end
end
carts_controller.rb - 我正在尝试做的事情(我认为这可能有问题,因为它不知道如何解决 product = Product.find(params[:product_id])):
def destroy
@cart.destroy if @cart.id == session[:cart_id]
@cart.line_items.each do
product = Product.find(params[:product_id])
@total = @line_item.quantity
product.increment!(:quantity, @total)
end
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was emptied.' }
format.json { head :no_content }
end
end
编辑
尝试更改销毁方法:
def destroy
if @cart.id == session[:cart_id]
@cart.line_items.each do |l|
product = Product.where(:id => l.product_id)
@total = @l.quantity
product.increment!(:quantity, @total)
end
@cart.destroy
end
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was emptied.' }
format.json { head :no_content }
end
end
它给了我以下错误,即使我能够使用增量!关于 line_items_controller 中的产品数量:
undefined method `increment!' for #<Product::ActiveRecord_Relation:0xb5ad1b4>
还尝试将路径直接调用到购物车控制器方法中。它显示购物车已成功清空,但没有 return 当我在 html:
中调用相同的方法时产品数量应该是多少
if @cart.id == session[:cart_id]
@cart.line_items.each do |l|
empty_line_item_path(product_id: l.product)
end
@cart.destroy
end
对于您在 EDIT 部分之后的错误,您有...
product = Product.where(:id => l.product_id)
@total = @l.quantity
product.increment!(:quantity, @total)
where
方法不是 return 单个产品,它 return 是一种生产关系(可能只包含一个产品)。
更好的是...
product = Product.find_by(:id => l.product_id)
@total = @l.quantity
product.increment!(:quantity, @total)
...这将 return 一个产品对象。
关于destroy的问题,其实可以在model层面进行。
在您的 LineItem 模型上,您可以...
before_destroy { |record| record.product.increment!(:quantity, record.quantity }
这假设 LineItem 有...
belongs_to :product
并且无论 line_item 记录在何处被销毁,都将确保更新产品数量。
我是 rails 的新手,有一个简单的产品商店网站。当用户将产品添加到他们的购物车或更新购物车中的 line_item 数量时,它将根据需要从基础产品数量中 add/remove。但是,当他们清空购物车(delete/destroy 购物车)时,它不会恢复基本产品数量,就好像他们没有购买任何东西一样。如何将销毁方法更新为 return 列出的 line_item 回到原始产品数量?
line_items_controller.rb - 完全清空购物车中的一种产品 line_item 并增加基本产品数量的示例方法:
def empty
product = Product.find(params[:product_id])
@line_item = @cart.empty_product(product)
@total = @line_item.quantity
product.increment!(:quantity, @total)
respond_to do |format|
if @line_item.save
format.html { redirect_to :back, notice: 'Product removed.' }
format.js
format.json { render :show, status: :ok, location: @line_item }
else
format.html { render :edit }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
carts/show.html.erb - 调用 destroy/empty 购物车:
<%= link_to 'Empty Cart', @cart, method: :delete, data: {confirm: 'Are you sure you want to empty your cart?'}, :class => 'btn btn-danger whiteText' %>
carts_controller.rb - 当前销毁购物车的方法:
def destroy
@cart.destroy if @cart.id == session[:cart_id]
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was emptied.' }
format.json { head :no_content }
end
end
carts_controller.rb - 我正在尝试做的事情(我认为这可能有问题,因为它不知道如何解决 product = Product.find(params[:product_id])):
def destroy
@cart.destroy if @cart.id == session[:cart_id]
@cart.line_items.each do
product = Product.find(params[:product_id])
@total = @line_item.quantity
product.increment!(:quantity, @total)
end
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was emptied.' }
format.json { head :no_content }
end
end
编辑
尝试更改销毁方法:
def destroy
if @cart.id == session[:cart_id]
@cart.line_items.each do |l|
product = Product.where(:id => l.product_id)
@total = @l.quantity
product.increment!(:quantity, @total)
end
@cart.destroy
end
session[:cart_id] = nil
respond_to do |format|
format.html { redirect_to root_path, notice: 'Cart was emptied.' }
format.json { head :no_content }
end
end
它给了我以下错误,即使我能够使用增量!关于 line_items_controller 中的产品数量:
undefined method `increment!' for #<Product::ActiveRecord_Relation:0xb5ad1b4>
还尝试将路径直接调用到购物车控制器方法中。它显示购物车已成功清空,但没有 return 当我在 html:
中调用相同的方法时产品数量应该是多少if @cart.id == session[:cart_id]
@cart.line_items.each do |l|
empty_line_item_path(product_id: l.product)
end
@cart.destroy
end
对于您在 EDIT 部分之后的错误,您有...
product = Product.where(:id => l.product_id)
@total = @l.quantity
product.increment!(:quantity, @total)
where
方法不是 return 单个产品,它 return 是一种生产关系(可能只包含一个产品)。
更好的是...
product = Product.find_by(:id => l.product_id)
@total = @l.quantity
product.increment!(:quantity, @total)
...这将 return 一个产品对象。
关于destroy的问题,其实可以在model层面进行。
在您的 LineItem 模型上,您可以...
before_destroy { |record| record.product.increment!(:quantity, record.quantity }
这假设 LineItem 有...
belongs_to :product
并且无论 line_item 记录在何处被销毁,都将确保更新产品数量。