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
。如果位置已经设置或您要更改现有实例,您可能希望单独保留该位置。
我试图在保存我的 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
。如果位置已经设置或您要更改现有实例,您可能希望单独保留该位置。