Rails 6 之前保存回调未触发

Rails 6 before save callback not fired

我试图在保存我的 Product 对象之前将一个随机数分配给名为 position 的属性。我无法让回调正常工作。控制台中没有任何错误,只是默默地失败了。

这是我的模型

class Product < ApplicationRecord
validates_presence_of :position
before_save {
    assign_position
}

private
    def assign_position
        self.position = rand(150)
    end
end

这是我的架构

create_table "products", force: :cascade do |t|
    t.string "name"
    t.integer "position"
end

这是我用来测试保存前回调的示例种子。

Product.create(name: "Rose Deep Hydration Facial Toner")

创建种子后检查时没有错误,但控制台输出

irb(main):079:0> Product.find_by_name("Rose Deep Hydration Facial Toner").position
Product Load (1.8ms)  SELECT "products".* FROM "products" WHERE "products"."name" =  ORDER BY "products"."created_at" DESC LIMIT   [["name", "Rose Deep Hydration Facial Toner"], ["LIMIT", 1]]
=> nil

我在应用程序中有其他回调正常工作。我不明白为什么这个不起作用。

您的问题是验证发生在 before_save 回调被触发之前。你有这个:

validates_presence_of :position

但在检查验证时 position 仍将是 nil

我认为您想使用 before_validation 回调而不是 before_save:

class Product < ApplicationRecord
  before_validation :assign_position
  validates_presence_of :position

private

  def assign_position
    self.position = rand(150)
  end
end

请记住,每次您验证产品时都会调用 assign_position,因此更新名称中的拼写错误(例如)将更改 position。如果位置已经设​​置或您要更改现有实例,您可能希望单独保留该位置。