在保存我的position对象之前,我试图为一个名为Product的属性分配一个随机数。我不能让电话恢复正常工作。控制台中没有错误,只是无声地失败了。
这是我的模型
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" = $1 ORDER BY "products"."created_at" DESC LIMIT $2 [["name", "Rose Deep Hydration Facial Toner"], ["LIMIT", 1]]
=> nil我在应用程序中还有其他可以正常工作的回调。我搞不懂为什么这个不行。
发布于 2021-11-24 23:13:44
您的问题是,在触发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。如果已经设置了该职位,或者您正在更改现有实例,则可能希望将其单独保留。
https://stackoverflow.com/questions/70103725
复制相似问题