(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 中的代码来看,您似乎不希望在每次验证之前检查它,因此您可以删除该行(或编写一个实例方法来满足您的任何目的)。