Rails 「疑问」Rails 4 关联用户 id 的购物车实现

dreamcity · 2013年10月14日 · 最后由 dreamcity 回复于 2013年12月01日 · 3203 次阅读

最近做一个电子商务平台练手。设计要求:只有用户登陆以后才能购物,每个注册的用户要有自己的购物车,相同用户再次登录以后购物车里边的物品还在,不知道怎么来实现。

购物车是参考《敏捷开发》那本书里边的购物车,但是每次不同的用户登录上去以后,他的购物车里边是同样的商品。

数据库表之间的关系:

  • 用户表:Users has_one : cart
  • 购物车表:Carts belongs_to :user (表中通过 user_id 关联)
  • 用户表与购物车表为一对一的关系。
  • 之后对于购物车与商品之间我才用多对多,通过关系表连接
  • 购物车表:has_many :line_items
  • 商品表:has_many :line_items
  • 关系表:belongs_to :flower belongs_to :cart
| id | user_id | created_at | updated_at |
+----+---------+---------------------+---------------------+
| 4 | NULL | 2013-10-09 09:19:30 | 2013-10-09 09:19:30 |

似乎这个方法需要修改,我一直没能该对

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

因为当购物车 cart 为空时,就会报错。可能是由于 cart 模型验证,user_id 为空,cart 没能建立。但奇怪的是 line_items 表中数据会写入,此时 cart_id 为空。

控制器代码 cart_controller.rb

def create
    @cart = Cart.new(cart_params)
    respond_to do |format|
    if @cart.save
    format.html { redirect_to @cart, notice: 'Cart was successfully created.' }
    format.json { render action: 'show', status: :created, location: @cart }
   else
     format.html { render action: 'new' }
     format.json { render json: @cart.errors, status: :unprocessable_entity }
   end
end

def cart_params
params.require(:cart).permit(:user_id)
# :cart.user_id = current_user.id

end

line_items_controller.rb
def create
@cart = current_cart
# @cart = Cart.new()
flower = Flower.find(params[:flower_id])
@line_item = @cart.add_flower(flower.id)
# @line_item = @cart.line_items.build(:flower => flower)

  if @line_item.save
   redirect_to @line_item.cart
   # redirect_to flowers_url
    else
      render 'new'
  end

end

不是很明白你到底想表达什么,line_item 能在 cart_id 为空的时候能写入就意味着你没做 cart_id 的非空判定,也许是你的数据库里面 line_item 上的 cart_id 字段就是可以为空的。

def current_cart
  current_user.cart || current_user.create_cart
end

感觉 CartController 用不到。

#2 楼 @Ryan 恩,十分感谢你们的帮助!谢谢!这段时间在准备考试,没鼓捣!问题就搁置了!万分抱歉! #3 楼 @reyesyang 恩,十分感谢你们的帮助!谢谢!这段时间在准备考试,没鼓捣!问题就搁置了!万分抱歉!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号