我正在撰写电子商务网站,我需要实施购物车功能。我希望客户能够在不事先注册的情况下将产品添加到购物车中,所以我想我会通过会话来实现这一目标。
这可以在Devise gem中完成,还是我必须实现自己的会话模型才能使用?
答案 0 :(得分:7)
您需要处理自己的会话数据 - 并不意味着您需要session model。
我们已经在http://www.firststopcosmeticshop.co.uk(开发应用)实现了您所需要的功能。它使用会话模型,但使用我为您推荐的相同基本功能:
#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
<强>会话强>
根据Rails documentation:
据我所知,会话是存储每个用户数据的小cookie文件。这些是不明确的(为每个用户创建 - 无论他们是否登录),这意味着我将它们用于您的购物车大多数应用程序需要跟踪特定的某些状态 用户。这可以是购物篮的内容或用户ID 当前登录用户的数量。没有会议的想法, 用户必须识别并且可能在每个上进行身份验证 请求。如果是新用户,Rails将自动创建一个新会话 访问应用程序。如果用户,它将加载现有会话 已经使用过该应用程序。
我们使用Sessions
通过在会话中存储购物车产品的原始id
来创建购物车数据
<强>设计强>
关于Devise的说明 - 你所询问的与Devise gem无关。 Devise是一个身份验证系统,意味着它可以处理用户是否有权访问您的应用程序;它不处理购物车数据
虽然Devise将数据存储在sessions
,但您需要为购物车定义自己的session
数据。我们使用带有上述模型代码的cart
控制器执行此操作:
#config/routes.rb
get 'cart' => 'cart#index', :as => 'cart_index'
post 'cart/add/:id' => 'cart#add', :as => 'cart_add'
delete 'cart/remove(/:id(/:all))' => 'cart#delete', :as => 'cart_delete'
#app/controllers/cart_controller.rb
class CartController < ApplicationController
include ApplicationHelper
#Index
def index
@items = cart_session.cart_contents
@shipping = Shipping.all
end
#Add
def add
session[:cart] ||={}
products = session[:cart][:products]
#If exists, add new, else create new variable
if (products && products != {})
session[:cart][:products] << params[:id]
else
session[:cart][:products] = Array(params[:id])
end
#Handle the request
respond_to do |format|
format.json { render json: cart_session.build_json }
format.html { redirect_to cart_index_path }
end
end
#Delete
def delete
session[:cart] ||={}
products = session[:cart][:products]
id = params[:id]
all = params[:all]
#Is ID present?
unless id.blank?
unless all.blank?
products.delete(params['id'])
else
products.delete_at(products.index(id) || products.length)
end
else
products.delete
end
#Handle the request
respond_to do |format|
format.json { render json: cart_session.build_json }
format.html { redirect_to cart_index_path }
end
end
end
答案 1 :(得分:0)
session[:product_id] = []
当用户将某个项目添加到购物车时,将该项目的id
推送到此阵列
答案 2 :(得分:0)
你可以这样做:
session["product_id"] << params["product_id"]
答案 3 :(得分:0)
如果您使用的是数据库支持的购物车,则可以将购物车ID保留在会话中。当新用户访问网站时,Rails会自动创建新会话。我在ApplicationController中定义了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