2016-09-29 63 views
0

在我的Rails应用程序,我有这样的代码在我_navbar.html.erb显示车项目,而不是在导航栏的Rails应用车总价数

  <% 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 
+1

不应该只是被总结所有与'cart'关联的所有'product_items'的数量? – lusketeer

+0

是的,但我不确定如何将其写入导航栏代码中......目前,由于缺乏红宝石体验,此操作很复杂 – Slowboy

+0

'<%= @ cart.products.count%>' –

回答

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 %>  
0

如果你想总计在车中的物品,只取quantity列在product_items总和在Cart模型中,像这样:

def total_quantity 
    product_items.sum(:quantity) 
end 

然后,你可以调用从视图@cart.total_quantity(或其他地方)。

注意,通过调用sumproduct_items,这是一个关系(而不是一个阵列),这直接计算的总和使用SQL:

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

其中123是车的ID。

这比产品项目(即product_items.to_a.sum(&:quantity)),其将加载每个产品,然后求和量的阵列上调用sum更有效。但是,要么应该工作,并根据你在做什么,后者sum可能更适合你的需求。