我对rails非常陌生,到目前为止,我试图计算订单总数而没有太多运气。我没有篮子或购物车模型,而是将物品放在篮子里。我想在创建订单之前显示购物篮中产品的总价格。
我有订单型号,产品型号和Order_Product型号。
在我的订单模型中,我有以下关系:
has_many :order_products
has_many :products, through: :order_products
在我的产品型号中,我有以下关系:
has_many :order_products
has_many :orders, through: :order_products
在我的Order_Product模型中,我有以下关系:
belongs_to :order
belongs_to :product
在我的订单模型中,我有以下方法:
def total
products.sum(&:price)
end
在视图中我有:
<%= @order.total%>
我有一个带有以下内容的篮子控制器:
def create
product = Product.find(params[:product_id])
basket.add(product.id)
flash[:success] = "Product added to basket"
redirect_to product_path(product)
end
带有这个的订单控制器:
def new
@order = Order.new
basket.each do |item_id|
@order.order_products.build(product: Product.find(item_id))
end
end
以下是我的应用程序控制器中的篮子会话:
def basket
session[:basket] ||= Set.new
end
不会抛出任何错误,但视图中呈现的总数为&#39; 0&#39;尽管订单中有物品。任何人都可以帮忙,因为我不知道该怎么做?
非常感谢
答案 0 :(得分:2)
没有错误被抛出,但视图中呈现的总数为“0”,尽管订单中有项目。
所选的products
位于basket
(存储在会话中)中,但尚未与order
相关联。因此,总计将呈现为0
。
从评论中抓住线索。 根据您对Babar评论的回复:
Babar:我相信你想在创建订单之前从购物篮中的产品中显示你的观点中的总价吗?詹姆斯:是的 这是完全正确的!
为了显示购物篮中产品的浏览总价,您可以在app/helpers/products_helper.rb
文件中添加帮助方法。这样,该方法将在app/views/products
目录下的所有视图中自动提供。
module ProductsHelper
def basket_total
Product.where(id: basket.to_a).sum(:price)
end
end
此外,如果您计划在整个网站的所有网页的标头中显示mini-basket
,那么最好在ApplicationHelper
模块中移动辅助方法({{1} })因此它将自动在您的应用程序中的所有视图中可用。
app/helpers/application_helper.rb
接下来,最好在module ApplicationHelper
def basket_total
Product.where(id: basket.to_a).sum(:price)
end
end
中移动basket
方法,以便ApplicationHelper
以及您的观点可以访问这些方法。
因此,您更新的basket_total
应如下所示:
ApplicationHelper
为了使module ApplicationHelper
def basket_total
Product.where(id: basket.to_a).sum(:price)
end
def basket
session[:basket] ||= Set.new
end
end
中的方法适用于所有控制器,您需要更新ApplicationHelper
(ApplicationController
),如下所示:
app/controllers/application_controller.rb
最后,要访问视图中的class ApplicationController < ActionController::Base
include ApplicationHelper ## Add this
## ...
end
方法,请使用
basket_total
答案 1 :(得分:1)
def total
price=Product.find(session[:basket].to_a).collect{|product| product.price}.sum
end