如何仅在会话中保存购物车中的line_items?

时间:2013-08-30 21:30:11

标签: ruby-on-rails ruby session session-variables shopping-cart

我是铁杆上的红宝石新手,我正在制作购物车,无需登录即可将产品添加到购物车中,无需登录即可购买购物车中的商品,因此我不必将购物车保存在数据库中,我需要在会话中保存购物车,购物车中有许多line_items,每个line_item都有一个产品,另一种情况是用户登录时,在这种情况下,我必须将购物车存储在数据库中,这部分正在运行,但我需要的是将多个line_items的购物车添加到会话,因为用户已注销,我搜索但无法找到任何有用的东西,我感谢任何帮助,任何想法,任何解决我的问题的链接。感谢

请原谅我的英语不是我的母语

2 个答案:

答案 0 :(得分:1)

Rails使您能够在会话哈希中存储信息。我建议在会话哈希中添加一个键来存储一个行项目数组。我会把这样的东西放在你的控制器或应用程序控制器中,如下例所示:

class ApplicationController < ActionController::Base
  before_filter :build_temporary_cart

  def build_temporary_cart
    # This assumes that you check for logged in user using current_user
    session[:temporary_shopping_cart] = [] unless current_user
  end
end

当您的访客用户点击添加到购物车时,您会在订单项控制器或用于向购物车添加商品的控制器中执行以下操作:

session[:temporary_shopping_cart] << @line_item

有关访问会话哈希的更多信息,请查看http://guides.rubyonrails.org/action_controller_overview.html#accessing-the-session

答案 1 :(得分:0)

我认为更好的方法是仅在会话中存储cart_id。然后所有项目都存储在数据库中(与登录用户相同) 你可以这样做:

def current_cart
  Cart.find(session[:cart_id]
  Rescue ActiveRecord::RecordNotFound
  cart = Cart.create
  session[:cart_id] = cart.id
end 

您必须创建包含has_many line_items并添加依赖以销毁

的购物车模型
has_many :line_items , :dependent => :destroy 

在用户完成购买后,您可以销售其中包含所有line_items的购物车商品。