购物车,可以使用Devise的会话function吗?

我正在写一个电子商务网站,我需要实现一个购物车function。 我希望客户能够在不事先注册的情况下将产品添加到购物车中,所以我想我会通过会话来实现这一目标。

这可以在Devise gem中完成,还是我必须实现自己的会话模型才能工作?

您需要处理自己的会话数据 – 并不意味着您需要会话模型 。

我们已经在http://www.firststopcosmeticshop.co.uk (开发应用程序)中实现了您正在寻找的内容。 它使用会话模型,但使用我为您推荐的相同基本function:

#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 文档 :

大多数应用程序需要跟踪特定用户的特定状态。 这可以是购物篮的内容或当前登录用户的用户ID。 如果没有会话的想法,用户将不得不在每个请求上识别并可能进行身份validation。 如果新用户访问应用程序,Rails将自动创建新会话。 如果用户已使用该应用程序,它将加载现有会话。

据我所知,会话是存储每个用户数据的小cookie文件。 这些是模糊的(为每个用户创建 – 无论他们是否登录),这意味着我将它们用于您的购物车

我们使用Sessions通过在会话中存储购物车产品的原始id来创建购物车数据


设计

关于Devise的说明 – 你所询问的与Devise gem无关。 Devise是一个身份validation系统,意味着它可以处理用户是否有权访问您的应用程序; 它不处理购物车数据

虽然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 
 session[:product_id] = [] 

当用户将某个项目添加到购物id ,将该项目的id推送到此数组

你可以这样做:

 session["product_id"] << params["product_id"] 

如果您使用的是数据库支持的购物车,则可以将购物车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