В моем проекте Rails 3.1.2 я использую ActiveRecord как I18n.backend.Я хочу кешировать значения в MemCache.Но у меня есть странные различия в поведении между моей средой разработки и бета-версией.
Мой 'config / initializers / i18n.rb'
# https://github.com/svenfuchs/i18n-active_record/blob/master/lib/i18n/backend/active_record/translation.rb
require 'i18n/backend/active_record'
require 'i18n_cache_backend'
I18n.default_locale = :en
I18n.backend.class.send(:include, I18n::Backend::Fallbacks)
active_record_backend = I18n::Backend::ActiveRecord.new
active_record_backend.class.send(:include, I18n::Backend::Fallbacks)
I18n::Backend::ActiveRecord.send :include, I18n::Backend::Cache
I18n.cache_store = Rails.application.config.i18n_cache_store
I18n.backend = I18n::Backend::Chain.new(active_record_backend, I18n.backend)
Мой 'lib / i18n_cache_backend', перезаписан: метод store_translation toочистить кеш.
module I18n::Backend::Cache
def store_translations(locale, data, options = {})
flatten_keys(data, true) do |key, value|
c_key = cache_key(locale, key.to_s, options)
I18n.cache_store.delete c_key
end
super
end
end
В 'config / environment / development.rb' у меня есть:
config.i18n_cache_store = ActiveSupport::Cache.lookup_store(:mem_cache_store,
'localhost', :namespace => "development")
В 'config / environment / beta.rb' у меня есть:
config.i18n_cache_store = ActiveSupport::Cache.lookup_store(:mem_cache_store,
'memcache.v.l', :namespace => "beta")
В консоли разработки rails:
ruby-1.8.7-p352 :008 > I18n.cache_store.clear
=> [<MemCache::Server: localhost:11211 [1] (CONNECTED)>]
ruby-1.8.7-p352 :009 > helper.t 'main.wire'
[SQL QUERY GOES HERE]
=> "Wire"
ruby-1.8.7-p352 :010 > helper.t 'main.wire'
=> "Wire"
ruby-1.8.7-p352 :011 > I18n.backend.store_translations(:en, {:main => {:wire => "foo bar baz"}}, {:rescue_format=>:html})
[SQL UPDATES GOES HERE]
=> {:"main.wire"=>"foo bar baz"}
ruby-1.8.7-p352 :012 > helper.t 'main.wire'
[SQL QUERY GOES HERE]
=> "foo bar baz"
ruby-1.8.7-p352 :013 > helper.t 'main.wire'
=> "foo bar baz"
В консоли консоли beta beta:
ruby-1.8.7-p352 :001 > I18n.cache_store.clear
=> [<MemCache::Server: memcache.v.l:11211 [1] (CONNECTED)>]
ruby-1.8.7-p352 :002 > helper.t 'main.wire'
[SQL QUERY GOES HERE]
=> "Wire"
ruby-1.8.7-p352 :003 > helper.t 'main.wire'
=> "Wire"
ruby-1.8.7-p352 :004 > I18n.backend.store_translations(:en, {:main => {:wire => "foo bar baz"}}, {:rescue_format=>:html})
[SQL UPDATES GOES HERE]
=> {:"main.wire"=>"foo bar baz"}
ruby-1.8.7-p352 :005 > helper.t 'main.wire'
=> "Wire"
ruby-1.8.7-p352 :006 > helper.t 'main.wire'
=> "Wire"
ruby-1.8.7-p352 :007 > I18n.cache_store.clear
=> [<MemCache::Server: memcache.v.l:11211 [1] (CONNECTED)>]
ruby-1.8.7-p352 :008 > helper.t 'main.wire'
[SQL QUERY GOES HERE]
=> "foo bar baz"
ruby-1.8.7-p352 :009 > helper.t 'main.wire'
=> "foo bar baz"
У кого-нибудь есть идеи?В кеше разработки для перевода есть clrear после каждого: store_translation, в бета-кэше значение не обновляется, если я не сделаю I18n.cache_store.clear