Ruby on rails 购物车,可使用Desive&x27;s会话功能?
我正在写一个电子商务网站,我需要实现一个购物车功能。我希望客户能够在不事先注册的情况下将产品添加到购物车中,所以我想我可以通过会话来完成这一点 这可以在Desive gem中完成吗,或者我必须实现自己的会话模型才能工作Ruby on rails 购物车,可使用Desive&x27;s会话功能?,ruby-on-rails,ruby-on-rails-4,devise,e-commerce,Ruby On Rails,Ruby On Rails 4,Devise,E Commerce,我正在写一个电子商务网站,我需要实现一个购物车功能。我希望客户能够在不事先注册的情况下将产品添加到购物车中,所以我想我可以通过会话来完成这一点 这可以在Desive gem中完成吗,或者我必须实现自己的会话模型才能工作 session[:product_id] = [] 当用户将某些项目添加到购物车时,将该项目的id推送到该数组中您将需要处理自己的会话数据-但这并不意味着您将需要一个会话 我们已经实现了你想要的。它使用会话模型工作,但使用我推荐给您的相同基本功能: #app/models/ca
session[:product_id] = []
当用户将某些项目添加到购物车时,将该项目的
id
推送到该数组中您将需要处理自己的会话数据-但这并不意味着您将需要一个会话
我们已经实现了你想要的。它使用会话模型工作,但使用我推荐给您的相同基本功能:
#app/models/cart_session.rb
class CartSession
#Initalize Cart Session
def initialize(session)
@session = session
@session[:cart] ||= {}
end
#Cart Count
def cart_count
if (@session[:cart][:products] && @session[:cart][:products] != {})
@session[:cart][:products].count
else
0
end
end
#Cart Contents
def cart_contents
products = @session[:cart][:products]
if (products && products != {})
#Determine Quantities
quantities = Hash[products.uniq.map {|i| [i, products.count(i)]}]
#Get products from DB
products_array = Product.find(products.uniq)
#Create Qty Array
products_new = {}
products_array.each{
|a| products_new[a] = {"qty" => quantities[a.id.to_s]}
}
#Output appended
return products_new
end
end
#Qty & Price Count
def subtotal
products = cart_contents
#Get subtotal of the cart items
subtotal = 0
unless products.blank?
products.each do |a|
subtotal += (a[0]["price"].to_f * a[1]["qty"].to_f)
end
end
return subtotal
end
#Build Hash For ActiveMerchant
def build_order
#Take cart objects & add them to items hash
products = cart_contents
@order = []
products.each do |product|
@order << {name: product[0].name, quantity: product[1]["qty"], amount: (product[0].price * 100).to_i }
end
return @order
end
#Build JSON Requests
def build_json
session = @session[:cart][:products]
json = {:subtotal => self.subtotal.to_f.round(2), :qty => self.cart_count, :items => Hash[session.uniq.map {|i| [i, session.count(i)]}]}
return json
end
end
您可以简单地执行以下操作:
session["product_id"] << params["product_id"]
session[“product_id”]如果您使用的是由数据库支持的购物车,则可以在会话中保留购物车id。Rails在新用户访问网站时自动创建新会话。我在ApplicationController中定义了cart方法来管理cart
def cart
return Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create(:cart_count=> 0)
session[:cart_id] = cart.id
return cart
end
我明白了,但我仍然需要实现某种会话身份验证系统是吗?假设我不是从索引视图(cart\u index\u path)添加到购物车,而是可能添加一个存储视图(store\u path(:store\u id))。。。如何将产品添加到购物车,但保持相同的视图?您将如何通过:门店号?
def cart
return Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create(:cart_count=> 0)
session[:cart_id] = cart.id
return cart
end