首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保存回调之前,Rails 6未触发

在保存回调之前,Rails 6未触发
EN

Stack Overflow用户
提问于 2021-11-24 22:34:11
回答 1查看 253关注 0票数 1

在保存我的position对象之前,我试图为一个名为Product的属性分配一个随机数。我不能让电话恢复正常工作。控制台中没有错误,只是无声地失败了。

这是我的模型

代码语言:javascript
复制
class Product < ApplicationRecord
validates_presence_of :position
before_save {
    assign_position
}

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

这是我的模式

代码语言:javascript
复制
create_table "products", force: :cascade do |t|
    t.string "name"
    t.integer "position"
end

下面是我用来测试以前保存回调的一个示例种子。

代码语言:javascript
复制
Product.create(name: "Rose Deep Hydration Facial Toner")

在创建种子后进行检查时,除了控制台输出外,没有任何错误。

代码语言:javascript
复制
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

我在应用程序中还有其他可以正常工作的回调。我搞不懂为什么这个不行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-24 23:13:44

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

代码语言:javascript
复制
validates_presence_of :position

但是,当检查验证时,position仍然是nil

我认为您希望使用before_validation回调而不是before_save

代码语言:javascript
复制
class Product < ApplicationRecord
  before_validation :assign_position
  validates_presence_of :position

private

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70103725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档