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

时间:2016-04-03 15:01:39

标签: ruby-on-rails activerecord slug

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

after_commit :create_slug, on: :create

def create_slug
    self.slug = generate_slug
    self.save
end

当我尝试保存对象时,我会得到一个太深的"堆栈级别"错误。我假设是因为我保存了对象并且它一次又一次地调用了after_commit回调。

在这种情况下,生成和保存独特slu g的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我建议在create而不是after_commit上使用after_validation回调。您将调用多个事务,这不是此回调的意图。我要做的是:

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

还要确保generate_slug内没有保存操作。该方法应该只返回一个值以插入slug属性。

答案 1 :(得分:0)

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

def create_slug
    update_column('slug ', generate_slug)
end