红宝石在轨道上,问题与购物车&当前用户

时间:2016-09-06 15:43:53

标签: ruby-on-rails ruby

我按照Michael Hartl的教程创建了一个购物车,我遇到了一些问题。

  1. 每个用户都可以使用不同的ID来创建新的购物车,但是当不同的用户将产品添加到购物车时,添加的产品会添加到所有不同的' id&#39的购物车中;而不是current_user

  2. 的特定购物车
  3. 如何限制用户只能查看自己的购物车,而无法查看其他用户购物车?

  4. 请指导以上解决上述问题,非常感谢!

    user.rb (不是完整的代码,因为它会很长,除了Michael Hartl教程的原始代码之外还添加了' has_one:cart')

    class User < ActiveRecord::Base
    attr_accessor :remember_token, :activation_token, :reset_token
    before_save :downcase_email
    before_create  :create_activation_digest
    has_many :orders
    has_one :cart
    

    cart.rb

    class Cart < ActiveRecord::Base
    has_many :line_items, dependent: :destroy
    belongs_to :user
    
    def add_product(product_id)
        current_item = line_items.find_by(product_id: product_id)
            if current_item
                current_item.quantity += 1 #quantity of line_item, product in cart
            else
                current_item = line_items.build(product_id: product_id)
            end
        current_item
    end
    
    
    def total_price
        line_items.to_a.sum { |item| item.total_price }
    end
    end
    

    顾虑/ Current_Cart.rb

    module CurrentCart
    extend ActiveSupport::Concern
    
    private
     def set_cart
      @cart = current_user.cart || current_user.create_cart
      session[:cart_id] = @cart.id
     end
    end
    

    line_items_controller.rb

    class LineItemsController < ApplicationController
    include CurrentCart
    before_action :set_cart, only: [:create] #before create, execute :set_cart, find(or create) cart
    before_action :set_line_item, only: [:show, :edit, :update, :destroy]
    
    
    def index
      @line_items = LineItem.all
    end
    
    def show
    end
    
    def new
      @line_item = LineItem.new
    end
    
    def edit
    end
    
    def create
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)
      if @line_item.save
        redirect_to current_user.cart 
      else
        render :new 
      end
    end
    
    def update
      if @line_item.update(line_item_params)
        redirect_to @line_item, notice: 'Line item was successfully updated.' 
      else
        render :edit 
      end
    end
    
    def destroy
    @line_item.destroy
      redirect_to line_items_url, notice: 'Line item was successfully destroyed.' 
    end
    
    private
    def set_line_item
      @line_item = LineItem.find(params[:id])
    end
    
    def line_item_params
      params.require(:line_item).permit(:product_id)
    end
    end
    

    carts_controller.rb

    class CartsController < ApplicationController
    before_action :set_cart, only: [:edit, :update, :destroy]
    rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart
    
    
    def show
      @cart = current_user.cart
    end
    
    def edit
    end
    
    
    def update
      if @cart.update(cart_params)
        redirect_to @cart, notice: 'Cart was successfully updated.' 
      else
        render :edit 
      end
    end
    
    
    def destroy
      @cart.destroy if @cart.id == session[:cart_id]
      session[:cart_id] = nil
      redirect_to store_url
    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.fetch(:cart, {})
    end
    
    def invalid_cart
      logger.error "Attempt to access invalid cart #{params[:id]}"
      redirect_to store_url, notice: 'Invalid cart'
    end
    end
    

1 个答案:

答案 0 :(得分:0)

  

如果我以id为'1'的用户身份登录,我创建了ID为'1'的购物车。我退出了,再次使用另一个ID为'2'的帐户登录,创建了一个ID为'2'的购物车,但是当我访问另一个带有链接购物车/ 1的购物车时,我仍然可以看到来自其他用户的购物车,而不是即将发生。希望你明白 -

您可以查看其他人购物车的原因是控制器代码。

每当您show购物车时,控制器首先使用控制器内的set_cart设置购物车。

def set_cart
  @cart = Cart.find(params[:id])
end

这将获取具有特定ID的任何购物车。

然后show将显示传递给它的任何购物车。

def show
  @cart = current_user.cart
end

您应该做的是使用current_cart.rb设置购物车并从控制器中删除现有的set_cart。另外,请set_cart公开{。}}。{/ p>

您还需要更改current_cart.rb路由,因为它需要show,现在我们不会告诉服务器要查看哪个购物车。

我确切地忘记了这本书包含:id的确切位置,我相信它出现在CurrentCart中。如果是这样,那么ApplicationController应该可以正常使用其他逻辑。