在更新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
这有效,但对我来说仍然不合适!
答案 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