If I set this in my environment
config.action_controller.cache_store = :mem_cache_store
ActionController::Base.cache_store will use a memcached store but Rails.cache will use a memory store instead:
$ ./script/console
>> ActionController::Base.cache_store
=> #<ActiveSupport::Cache::MemCacheStore:0xb6eb4bbc @data=<MemCache: 1 servers, ns: nil, ro: false>>
>> Rails.cache
=> #<ActiveSupport::Cache::MemoryStore:0xb78b5e54 @data={}>
In my app, I use Rails.cache.fetch(key){ object } to cache objects inside my helpers. All this time, I assumed that Rails.cache uses the memcached store so I'm surprised that it uses memory store.
If I change the cache_store setting in my environment to
config.cache_store = :mem_cache_store
both ActionController::Base.cache_store and Rails.cache will now use the same memory store, which is what I expect:
$ ./script/console
>> ActionController::Base.cache_store
=> #<ActiveSupport::Cache::MemCacheStore:0xb7b8e928 @data=<MemCache: 1 servers, ns: nil, ro: false>, @middleware=#<Class:0xb7b73d44>, @thread_local_key=:active_support_cache_mem_cache_store_local_cache>
>> Rails.cache
=> #<ActiveSupport::Cache::MemCacheStore:0xb7b8e928 @data=<MemCache: 1 servers, ns: nil, ro: false>, @middleware=#<Class:0xb7b73d44>, @thread_local_key=:active_support_cache_mem_cache_store_local_cache>
However, when I run the app, I get a "marshal dump" error in the line where I call Rails.cache.fetch(key){ object }
no marshal_dump is defined for class Proc
Extracted source (around line #1):
1: Rails.cache.fetch(fragment_cache_key(...), :expires_in => 15.minutes) { ... }
vendor/gems/memcache-client-1.8.1/lib/memcache.rb:359:in 'dump'
vendor/gems/memcache-client-1.8.1/lib/memcache.rb:359:in 'set_without_newrelic_trace'
What gives? Is Rails.cache meant to be a memory store? Should I call controller.cache_store.fetch in the places where I call Rails.cache.fetch?