【问题标题】:(NoMethodError) Undefined private method in model - Rails(NoMethodError) 模型中未定义的私有方法 - Rails
【发布时间】:2021-11-02 16:07:30
【问题描述】:

我正在构建一个简单的电子商务网页,我想要创建的功能是:

用户在其中一个产品中单击“添加到购物车”按钮 --> 使用 user_id 创建 ORDER --> 使用 order_id 和 product_id 创建 ORDER_ITEM。

我想在 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)然后返回该订单,如果没有创建一个。

在 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>

为什么会抛出该错误,我该如何解决?谢谢!

【问题讨论】:

    标签: ruby-on-rails model-view-controller private-methods


    【解决方案1】:

    您模型中的这一行是问题所在:

    before_validation :generate_order
    

    你只有一个类方法self.generate_order,但这会寻找一个实例方法。从self.generate_order 中的代码来看,您似乎不希望在每次验证之前对其进行检查,因此您可以删除该行(或编写一个实例方法来满足您的任何目的)。

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2018-06-16
      • 2015-06-30
      • 1970-01-01
      相关资源
      最近更新 更多