我按照Michael Hartl的教程创建了一个购物车,我遇到了一些问题。
每个用户都可以使用不同的ID来创建新的购物车,但是当不同的用户将产品添加到购物车时,添加的产品会添加到所有不同的' id&#39的购物车中;而不是current_user
如何限制用户只能查看自己的购物车,而无法查看其他用户购物车?
请指导以上解决上述问题,非常感谢!
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
答案 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
应该可以正常使用其他逻辑。