在 rails 中创建 Active Record 对象后生成 slug

Generating a slug after Active Record object creation in rails

我正在尝试在使用 after_commit 回调创建对象后为该对象生成一个唯一的 slug。

after_commit :create_slug, on: :create

def create_slug
    self.slug = generate_slug
    self.save
end

当我尝试保存对象时出现 "stack level too deep" 错误。我假设是因为我正在保存对象,它一次又一次地被称为 after_commit 回调。

在这种情况下生成和保存唯一 slug 的最佳方法是什么?

我建议在创建时使用 after_validation 回调而不是 after_commit。您将调用多个事务,这不是此回调的目的。我会做的是:

after_validation(on: :create) do
  self.slug = generate_slug
end

还要确保 generate_slug 中没有进行任何保存操作。该方法应该只是返回一个值以插入到 slug 属性中。

使用不触发回调的方法,例如:update_column

def create_slug
    update_column('slug ', generate_slug)
end