Rails Error: Undefined method `add_product' for nil:NilClass
Rails Error: Undefined method `add_product' for nil:NilClass
我是 Rails 的新手,所以我可能犯了一个愚蠢的错误,需要有人指出。
构建一个小型购物车应用程序。当我点击 'Add to Cart' 时,它会抛出这个错误:
NoMethodError in LineItemsController#create
undefined method `add_product' for nil:NilClass
参数:
{"authenticity_token"=>"uZ6zOfA237VBzt3Pz2tEBESzjv2pg+Vhx73DTolL8f76ANS80qiU6+wcN8Tvq/r+CSZvzxnkKll/ZJl2H2XePQ==",
"product_id"=>"1"}
代码如下:
line_items_controller
def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to customer_cart_path }
format.json { render :show, status: :created, location: @line_item }
else
format.html { render :new }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
购物车型号:
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
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
添加到购物车按钮:
<%= button_to 'Add to Cart', line_items_path(product_id: product) %>
提前致谢!
您尚未定义 @cart
实例变量并在 LineItemsController
的 create
方法中访问其 add_product
方法。
@line_item = @cart.add_product(product.id) # <== HERE
在您的代码中:
def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
行 [3],使用 @cart
,但 @cart 从未在它之前设置,所以它不知道它在那个时候是什么。
所以使用前需要设置@cart。例如:
@cart = Cart.find(params[:cart_id]
此外,您还需要更新代码:
<%= button_to 'Add to Cart', line_items_path(product_id: product) %>
至(如果您的 cart
对象存在于此处):
<%= button_to 'Add to Cart', line_items_path(product_id: product, cart_id: cart) %>
我是 Rails 的新手,所以我可能犯了一个愚蠢的错误,需要有人指出。
构建一个小型购物车应用程序。当我点击 'Add to Cart' 时,它会抛出这个错误:
NoMethodError in LineItemsController#create
undefined method `add_product' for nil:NilClass
参数:
{"authenticity_token"=>"uZ6zOfA237VBzt3Pz2tEBESzjv2pg+Vhx73DTolL8f76ANS80qiU6+wcN8Tvq/r+CSZvzxnkKll/ZJl2H2XePQ==",
"product_id"=>"1"}
代码如下:
line_items_controller
def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to customer_cart_path }
format.json { render :show, status: :created, location: @line_item }
else
format.html { render :new }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
购物车型号:
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
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
添加到购物车按钮:
<%= button_to 'Add to Cart', line_items_path(product_id: product) %>
提前致谢!
您尚未定义 @cart
实例变量并在 LineItemsController
的 create
方法中访问其 add_product
方法。
@line_item = @cart.add_product(product.id) # <== HERE
在您的代码中:
def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
行 [3],使用 @cart
,但 @cart 从未在它之前设置,所以它不知道它在那个时候是什么。
所以使用前需要设置@cart。例如:
@cart = Cart.find(params[:cart_id]
此外,您还需要更新代码:
<%= button_to 'Add to Cart', line_items_path(product_id: product) %>
至(如果您的 cart
对象存在于此处):
<%= button_to 'Add to Cart', line_items_path(product_id: product, cart_id: cart) %>