2015-01-08 2 views
0

Я пытаюсь создать корзину для покупок, которая назначена пользователю. Что происходит сейчас, хотя это когда товар добавляется в корзину покупок, он добавляется для каждого пользователя. Кажется, что каждый пользователь использует одну и ту же корзину, и я не могу заставить пользователей добавлять их к тележкам других пользователей. Как я могу сделать это так, чтобы каждый пользователь имел уникальную тележку и мог только добавить их?Назначение тележек пользователю

Вот что у меня есть:

class CartsController < ApplicationController 
    before_action :set_cart, only: [:show, :edit, :update, :destroy] 
    before_action :logged_in_user, only: [:create, :edit, :update, :destroy, :show] 
    rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart 

    # GET /carts 
    # GET /carts.json 
    def index 
    @carts = Cart.all 
    end 

    # GET /carts/1 
    # GET /carts/1.json 
    def show 
    end 

    # GET /carts/new 
    def new 
    @cart = Cart.new 
    end 

    # GET /carts/1/edit 
    def edit 
    end 

    # POST /carts 
    # POST /carts.json 
    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 
    end 

    # PATCH/PUT /carts/1 
    # PATCH/PUT /carts/1.json 
    def update 
    respond_to do |format| 
     if @cart.update(cart_params) 
     format.html { redirect_to @cart, notice: 'Cart was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @cart.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /carts/1 
    # DELETE /carts/1.json 
    def destroy 
    @cart.destroy if @cart.id == session[:cart_id] 
    session[:cart_id] = nil 
    respond_to do |format| 
     format.html { redirect_to store_url, notice: "Your cart is currently empty" } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_cart 
     @cart = Cart.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def cart_params 
     params[:cart] 
    end 

    def invalid_cart 
     logger.error "Attempt to access invalid cart #{params[:id]}" 
     redirect_to store_url, notice: "Invalid Cart" 
    end 
end 

current_cart.rb

module CurrentCart 
    extend ActiveSupport::Concern 

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

line_item_controller.rb

class LineItemsController < ApplicationController 
    include CurrentCart 
    before_action :set_cart, only: [:new, :create] 
    before_action :set_line_item, only: [:show, :edit, :update, :destroy] 


    # GET /line_items 
    # GET /line_items.json 
    def index 
    @line_items = LineItem.all 
    end 

    # GET /line_items/1 
    # GET /line_items/1.json 
    def show 
    end 

    # GET /line_items/new 
    def new 
    @line_item = LineItem.new 
    end 

    # GET /line_items/1/edit 
    def edit 
    end 

    # POST /line_items 
    # POST /line_items.json 
    def create 
    product = Product.find(params[:product_id]) 
    @line_item = @cart.add_product(product: product) 
    respond_to do |format| 
     if @line_item.save 
     format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @line_item } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /line_items/1 
    # PATCH/PUT /line_items/1.json 
    def update 
    respond_to do |format| 
     if @line_item.update(line_item_params) 
     format.html { redirect_to @line_item.cart, notice: 'Line item was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /line_items/1 
    # DELETE /line_items/1.json 
    def destroy 
    @line_item.destroy 
    respond_to do |format| 
     format.html { redirect_to line_items_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_line_item 
     @line_item = LineItem.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def line_item_params 
     params.require(:line_item).permit(:product_id) 
    end 
end 
+0

Я бы рекомендовал посмотреть на Шпрее и посмотреть, как они устанавливают «корзину». Для меня пользователь не имеет много тележек, у пользователя есть много заказов и заказов и в разных состояниях, таких как «полный», «платный», «отправленный» и, во-первых, «тележка». – BenMorganIO

ответ

0

Вместо Cart.create и Cart.find в CurrentCart.rb, вы должны делать что-то повесят как:

def set_cart 
    @cart = current_user.carts.find_by(id: session[:cart_id]) || current_user.carts.create 
    session[:cart_id] = @cart.id 
end 

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

+0

Кроме того, когда вы выходите из системы, вы должны установить 'session [: cart_id] = nil' – evanbikes

Смежные вопросы