Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 购物车,可使用Desive&x27;s会话功能?_Ruby On Rails_Ruby On Rails 4_Devise_E Commerce - Fatal编程技术网

Ruby on rails 购物车,可使用Desive&x27;s会话功能?

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

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

这可以在Desive gem中完成吗,或者我必须实现自己的会话模型才能工作

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