1

在 after_commit 回调中更新缓存属性时,我遇到了 Globalize3 gem 的问题。

#In My Model
after_commit :write_localized_caches
private
def write_localized_caches
  I18n.available_locales.each do |locale|
    Globalize.with_locale(locale) do
      self.write_attribute(:name, 'some localized string here')
    end
  end
end

它启动 after_commit callbach 并且该属性的值很好。但毕竟我的模特名字还是空的!

也许我在滥用with_locale或有人遇到同样的问题吗?

更新 1. 我肯定想使用 after_commit 回调对保存的对象执行复杂的查询。在回调中打印出 self.name 会返回我想要的:'correct_string'。但是 id 没有命中数据库。最后写了一个新的翻译作品。似乎 Globalize 在其地下室使用回调:

def write_localized_caches
I18n.available_locales.each do |locale|
  Globalize.with_locale(locale) do
    self.translations.create!(name: 'some localized string here', locale: locale)
  end
end
end

这可行,但我仍然觉得不对劲!

4

1 回答 1

0

在数据库完成保存记录后调用提交后。

如果您插入打印语句,例如

def write_localized_caches
  puts self.name # the name that you're seeing in the database

  # Globalize Block

  puts self.name # The name that was set above most likely
end

还要记住,从回调中返回 false 或 nil 将中止回调链并反转数据库事务。不过,after_commit 是在事务完成后调用的,所以这里没那么重要。

你可能想要 before_save。 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

于 2013-04-18T09:39:05.240 回答