(NoMethodError) 模型中未定义的私有方法 - Rails
(NoMethodError) Undefined private method in model - Rails
我正在构建一个简单的电子商务网页,我想要创建的功能是:
用户单击其中一个产品中的“添加到购物车”按钮 --> 使用 user_id 创建订单 --> 使用 order_id 创建 ORDER_ITEM和 product_id.
我想在 OrderItem 模型中构建所有逻辑:
class OrderItem < ApplicationRecord
belongs_to :order
belongs_to :product
before_validation :generate_order
private
def self.generate_order(user)
if Order.find_by(status: 1)
order = Order.find_by(status: 1)
else
order = Order.new(status: 1, total: 0, subtotal: 0, date: Date.today())
order.user = user
order.save!
end
return order
end
end
基本上,如果有未结订单(状态 = 1),则 return 该订单,如果没有则创建一个。
并且在 OrderItem 控制器中:
class OrderItemsController < ApplicationController
def create
@product = Product.find(params[:product_id])
@order = OrderItem.generate_order(current_user)
@order_item = OrderItem.new
@order_item.product = @product
@order_item.order = @order
if @order_item.save!
redirect_to cart_path
else
redirect_to root_path
end
end
def delete
end
end
在到达 .save 之前一切顺利!抛出此错误的点:
undefined method `generate_order' for #<OrderItem:0x00007fe8f77552c8>
我检查了日志,似乎一切都已经创建好了:
>> @order_item
=> #<OrderItem id: nil, order_id: 1, product_id: 65, created_at: nil, updated_at: nil>
>> @order
=> #<Order id: 1, subtotal: 0, total: 0, date: "2021-09-05 00:00:00", user_id: 5, created_at: "2021-09-05 00:00:12", updated_at: "2021-09-05 00:00:12", status: 1>
>> @product
=> #<Product id: 65, name: "Shou Mei", description: "Sequi dolores facilis rerum quo odit veritatis ips...", price: 5893, rating: 5, user_id: 13, created_at: "2021-09-03 23:54:46", updated_at: "2021-09-03 23:54:47", availability: 2>
为什么会抛出该错误,我该如何纠正?谢谢!
您模型中的这一行是问题所在:
before_validation :generate_order
您只有一个 class 方法 self.generate_order
,但这会寻找一个实例方法。从 self.generate_order
中的代码来看,您似乎不希望在每次验证之前检查它,因此您可以删除该行(或编写一个实例方法来满足您的任何目的)。
我正在构建一个简单的电子商务网页,我想要创建的功能是:
用户单击其中一个产品中的“添加到购物车”按钮 --> 使用 user_id 创建订单 --> 使用 order_id 创建 ORDER_ITEM和 product_id.
我想在 OrderItem 模型中构建所有逻辑:
class OrderItem < ApplicationRecord
belongs_to :order
belongs_to :product
before_validation :generate_order
private
def self.generate_order(user)
if Order.find_by(status: 1)
order = Order.find_by(status: 1)
else
order = Order.new(status: 1, total: 0, subtotal: 0, date: Date.today())
order.user = user
order.save!
end
return order
end
end
基本上,如果有未结订单(状态 = 1),则 return 该订单,如果没有则创建一个。
并且在 OrderItem 控制器中:
class OrderItemsController < ApplicationController
def create
@product = Product.find(params[:product_id])
@order = OrderItem.generate_order(current_user)
@order_item = OrderItem.new
@order_item.product = @product
@order_item.order = @order
if @order_item.save!
redirect_to cart_path
else
redirect_to root_path
end
end
def delete
end
end
在到达 .save 之前一切顺利!抛出此错误的点:
undefined method `generate_order' for #<OrderItem:0x00007fe8f77552c8>
我检查了日志,似乎一切都已经创建好了:
>> @order_item
=> #<OrderItem id: nil, order_id: 1, product_id: 65, created_at: nil, updated_at: nil>
>> @order
=> #<Order id: 1, subtotal: 0, total: 0, date: "2021-09-05 00:00:00", user_id: 5, created_at: "2021-09-05 00:00:12", updated_at: "2021-09-05 00:00:12", status: 1>
>> @product
=> #<Product id: 65, name: "Shou Mei", description: "Sequi dolores facilis rerum quo odit veritatis ips...", price: 5893, rating: 5, user_id: 13, created_at: "2021-09-03 23:54:46", updated_at: "2021-09-03 23:54:47", availability: 2>
为什么会抛出该错误,我该如何纠正?谢谢!
您模型中的这一行是问题所在:
before_validation :generate_order
您只有一个 class 方法 self.generate_order
,但这会寻找一个实例方法。从 self.generate_order
中的代码来看,您似乎不希望在每次验证之前检查它,因此您可以删除该行(或编写一个实例方法来满足您的任何目的)。