after_commit回调中的Globalize.with_locale不会改变任何内容

时间:2013-04-18 09:23:53

标签: ruby-on-rails callback globalize3 rails-i18n

在更新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

这有效,但对我来说仍然不合适!

1 个答案:

答案 0 :(得分:0)

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

如果插入

等打印语句
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