Как я могу связать пользователя с корзиной? - PullRequest
1 голос
/ 03 сентября 2011

В моем приложении есть пользователи и корзина для покупок.

В настоящее время нет связи между пользователями и корзинами покупок.

В настоящий момент, независимо от того, вошел ли пользователь в систему или нет, доступна только одна корзина покупок, current_cart создается при добавлении товара, а заказ_транзакции создается при оплате корзины (успех илипотерпеть поражение).В случае успеха новая корзина будет создана при следующем добавлении товара в корзину.

Как я могу связать корзину с пользователем, чтобы у каждого пользователя была новая корзина, созданная для него при добавлении продукта?

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

Спасибо за любую помощь, она очень ценится!

1 Ответ

0 голосов
/ 08 сентября 2011

Самый простой способ сделать это - сделать так, чтобы у пользователя была корзина

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 вещь для отслеживания в сеансе.Вам также следует попытаться переместить как можно большую часть «бизнес-логики» ВНИЗ на уровень модели, чтобы упростить тестирование.

...