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

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

Благодаря Railscasts у меня есть рабочая корзина, но в данный момент она создается в собственном сеансе Поэтому не имеет значения, если вы входите в систему как разные пользователи, используется только одна корзина, и все пользователи делятся ею.

В настоящее время создается так:

Прикладной контроллер

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time
  protect_from_forgery # See ActionController::RequestForgeryProtection for details
  helper_method :current_user
  helper_method :current_cart

  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
end

Контроллер позиций

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

Я дошел до того, что добавил user_id к модели корзины и установил пользователю has_one корзину и корзину принадлежащие пользователю, но я не могу понять, что нужно изменить в способе создания корзины, чтобы ее получить. на работу.

edit - контроллер сессий

  def create
    user = User.authenticate(params[:username], params[:password])
    if user
      session[:user_id] = user.id
      current_cart.user = current_user
      current_cart.save
      redirect_to root_path, :notice => "Welcome back!"
    else
      flash.now.alert = "Invalid email or password"
      render "new"
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_path, :notice => "Logged out!"
  end

Любая помощь очень ценится!

1 Ответ

3 голосов
/ 11 сентября 2011

Корзина привязана к сеансу, поэтому не все пользователи будут делиться ею, она будет уникальной для сеанса браузера, в котором она была создана - по сути, одна корзина для каждого созданного сеанса браузера, который посещает ваш метод LineItemsController # create.

Обычно это делается для того, чтобы корзину можно было создать до того, как пользователь войдет в систему или зарегистрируется, что уменьшит трения при добавлении товаров в корзину.

Если вы хотите связать корзину с пользователем, вы можете сделать это, когда он войдет или зарегистрируется. Если вы добавили отношение, это должно быть просто:

current_cart.user = current_user
current_cart.save
...