【问题标题】:How can I link a user with a shopping cart?如何将用户与购物车链接?
【发布时间】:2011-11-09 12:33:25
【问题描述】:

我的应用既有用户又有购物车。

目前用户和购物车之间没有链接。

目前,无论用户是否登录,都只有一个可用的购物车,添加产品时会创建 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

感谢您的任何帮助,非常感谢!

【问题讨论】:

    标签: ruby-on-rails activerecord shopping-cart


    【解决方案1】:

    最简单的方法是让用户拥有购物车

    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
    

    我会推荐这个。这样,您在会话中只有 ONE 需要跟踪。您还应该尝试将尽可能多的“业务逻辑”向下移动到模型层,以使其更易于测试。

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多