【问题标题】:Showing Number of Cart Items instead of Cart total price in navbar Rails app在导航栏 Rails 应用程序中显示购物车项目的数量而不是购物车总价
【发布时间】:2017-02-08 10:49:51
【问题描述】:

在我的 Rails 应用程序中,我的 _navbar.html.erb 中有此代码

            <% if @cart.total_price > 0 %>
                <%= link_to @cart do %> 
                    <i class="fa fa-shopping-cart"> &euro; </i>
                <%=  @cart.total_price %>
                <% end %>

                <% else %>
                    <a href="#" class="menu-cart"><i class="fa fa-shopping-cart"></i> &euro; 0.00</a>
                <% end %>

它显示@cart.total_price,但我希望它显示购物车中的总商品。

我不知道该怎么做

大部分代码来自 Udemy 教程,但对于我的经验而言,它变得有点多,所以我觉得尝试修改它以满足我的需要有点迷失。

我一直在尝试将@product_item添加到上面的代码中,但运气不好,谁能看看这个并指导我完成这个。

我在application_controller.rb中有这段代码

before_action :set_cart    

def set_cart
   @cart = Cart.find(session[:cart_id])
   rescue ActiveRecord::RecordNotFound
   @cart = Cart.create
   session[:cart_id] = @cart.id
end

carts_controller.rb我有这个:

class CartsController < ApplicationController

before_action :set_cart, only: [:show, :destroy]
rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart

def new
    @cart = Cart.new
end

def show
     @images  = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"]
 @random_no = rand(5)
 @random_image = @images[@random_no]

end


def destroy
    @cart.destroy if @cart.id == session[:cart_id]
    session[:cart_id] = nil
    redirect_to root_url, notice: 'Your Cart is Empty'
end


private

def set_cart
    @cart = Cart.find(params[:id])
end

def cart_params
    params[:cart]
end

def invalid_cart
    logger_error = 'You are trying to access invalid cart'
    redirect_to root_url, notice: 'Invalid Cart'
end
end

controllers/concerns我有这个文件current_cart.rb

module CurrentCart

private

def set_cart
    @cart = Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
    @cart = Cart.create
    session[:cart_id] = @cart.id
end
end

然后我有product_items_controller.rb 并且有这个代码:

class ProductItemsController < ApplicationController

include CurrentCart

before_action :set_cart, only: [:create]
before_action :set_product_item, only: [:show, :destroy]

def create

    @product = Product.find(params[:product_id])
    @product_item = @cart.add_product(@product.id)
    if @product_item.save
        redirect_to root_url, notice:'Product added to Cart'
    else
        render :new
    end
end

private

def set_product_items
    @product_item = ProductItem.find(params[:id])
end

def product_item_params
    params.require(:product_item).permit(:product_id)
end

end

而相关型号为cart.rbproduct_item.rb

cart.rb我有这个代码:

class Cart < ActiveRecord::Base

has_many :product_items, dependent: :destroy

def add_product(product_id)
    current_item = product_items.find_by(product_id: product_id)
    if current_item
        current_item.quantity += 1
    else
        current_item = product_items.build(product_id: product_id)
    end
    current_item
end

def total_price
    product_items.to_a.sum{|item| item.total_price}
end

end

product_item.rb 中有这样的代码:

class ProductItem < ActiveRecord::Base
 belongs_to :product
 belongs_to :cart
 belongs_to :order


 def total_price
    product.price * quantity
 end

end

【问题讨论】:

  • 不应该只是总结与cart相关联的所有product_items中的所有quantity吗?
  • 是的,但我不确定如何将其写入导航栏代码......目前,由于我缺乏 ruby​​ 经验,这有点复杂
  • &lt;%= @cart.products.count %&gt;

标签: ruby-on-rails ruby shopping-cart


【解决方案1】:

您可以将_navbar.html.erb 中的@cart 代码重写为如下所示,它应该像前一个块一样工作,但显示product_items.count 而不是total_price

<% if @cart.product_items.count > 0 %>
  <%= link_to @cart do %> 
  <i class="fa fa-shopping-cart"></i>
  <%= @cart.product_items.count %>
  <% end %>

  <% else %>
     <a href="#" class="menu-cart"><i class="fa fa-shopping-cart"></i> 0 </a>
<% end %>    

【讨论】:

    【解决方案2】:

    如果您想要购物车中的全部商品,只需在您的 Cart 模型中将 quantity 列与 product_items 相加,如下所示:

    def total_quantity
      product_items.sum(:quantity)
    end
    

    然后您可以从视图(或其他任何地方)调用@cart.total_quantity

    请注意,通过在 product_items 上调用 sum,这是一个关系(而不是数组),这会直接使用 SQL 计算总和:

    SELECT SUM(`product_items`.`quantity`) FROM product_items
      WHERE `product_items`.`cart_id` = 123
    

    123 是购物车的 ID。

    这比在 array 产品项(即product_items.to_a.sum(&amp;:quantity))上调用sum 更有效,后者将加载每个产品项,然后对数量求和。但是任何一个都应该工作,并且取决于你在做什么,后者 sum 可能更适合你的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      相关资源
      最近更新 更多