Rails - difference between config.cache_store and config.action_controller.cache_store?

Posted by gsmendoza on Stack Overflow See other posts from Stack Overflow or by gsmendoza
Published on 2010-04-07T09:38:32Z Indexed on 2010/04/07 9:43 UTC
Read the original article Hit count: 540

Filed under:

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?

© Stack Overflow or respective owner

Related posts about ruby-on-rails