[英]How can I link a user with a shopping cart?
我的应用程序同时包含用户和购物车。
当前,用户和购物车之间没有链接。
目前,无论用户是否登录,都只有一个购物车可用,添加产品时会创建current_cart,为购物车付款时(成功或失败)会创建order_transaction。 如果成功,则下次将产品添加到购物车时,将创建一个新的购物车。
如何将购物车与用户链接,以便每个用户在添加产品时都为其创建一个新的购物车?
application_controller
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def current_cart
if session[:cart_id]
@current_cart ||= Cart.find(session[:cart_id])
session[:cart_id] = nil if @current_cart.purchased_at
end
if session[:cart_id].nil?
@current_cart = Cart.create!
session[:cart_id] = @current_cart.id
end
@current_cart
end
路线
get "log_in" => "sessions#new", :as => "log_in"
get "log_out" => "sessions#destroy", :as => "log_out"
get "sign_up" => "users#new", :as => "sign_up"
get "cart" => "carts#show", :as => "current_cart"
resources :orders
resources :line_items
resources :carts
resources :products
resources :order_transactions
resources :sessions
resources :users
line_items_controller
class LineItemsController < ApplicationController
def create
@product = Product.find(params[:product_id])
@line_item = LineItem.create!(:cart => current_cart, :product => @product, :quantity => 1, :unit_price => @product.price)
flash[:notice] = "Added #{@product.name} to cart."
redirect_to current_cart_url
end
end
非常感谢您的帮助!
最简单的方法是使用户拥有购物车
class User < ActiveRecord::Base
has_one :cart
def current_cart
if self.cart.empty?
self.cart.create!
end
self.cart
end
end
class Cart < ActiveRecord::Base
belongs_to :user
def add_line_item(item)
etc...
end
end
class ApplicationController < ActionController::Base
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def current_cart
current_user.current_cart if current_user.present?
end
end
我会推荐这个。 这样,您只有一件事可以在会话中进行跟踪。 您还应该尝试将“业务逻辑”下移至模型层,以使其易于测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.