购物车开发思路

使用uuid这个值来关联user model和shopping_cart model, 其中user中保存的为uuid, shopping_cart中保存的为user_uuid

四种开发情景

1.用户未注册,未登录
2.用户未注册,未登录,但是去登录
3.用户未注册,未登录,但是去注册
4.用户打开页面的时候已经登录

四种场景中出现的统一场景:购物车开发的购物车列表是通过session[:user_uuid]来取得的
@shopping_carts = ShoppingCart.by_user_uuid(session[:user_uuid])
#1.用户未注册,未登录
刷新页面的时候,判断浏览器的cookies[:user_uuid]是否存在,若不存在,自动生成uuid,并且将uuid保存在session和cookies中
不管是否存在,都需要更新浏览器中的cookies的值

class ApplicationController < ActionController::Base
  before_action :set_browser_uuid

  def set_browser_uuid
    uuid = cookies[:user_uuid]
    unless uuid
      uuid = RandomCode.generate_utoken
      session[:user_uuid] = cookies.permanent['user_uuid'] = uuid
    end

    update_browser_uuid uuid
  end

  def update_browser_uuid uuid
    session[:user_uuid] = cookies.permanent['user_uuid'] = uuid
  end
end
#2.用户未注册,未登录,但是去登录(这个前提是,页面已经刷新,就是说执行了情况1)
class SessionsController < ApplicationController
  def create
    log_in user
    update_browser_uuid user.uuid  #登录的情况下,更新session和cookies的值
  end
end
#3.用户未注册,未登录,但是去注册(这个前提是,页面已经刷新,就是说执行了情况1)
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    @user.uuid = session[:user_uuid]  #将session中的uuid赋值给user
    @user.save
  end
end
#4.用户打开页面的时候已经登录
一般不会出现在登录的情况下,user的uuid和shopping_cart的user_uuid不一致的情况下,用户用户登录要进行如场景2的操作
两个数据会保持一致性。需要讨论的情况是,如果session和cookies被删除的情况下,该如何进行处理。
def set_browser_uuid
  uuid = cookies[:user_uuid]

  unless uuid #uuid进行判断是否存在的情况
    if logged_in?
      uuid = current_user.uuid
    else
      uuid = RandomCode.generate_utoken
    end
  end

  update_browser_uuid uuid
end

results matching ""

    No results matching ""