views:

713

answers:

5

This one has me stumped.

I have a view with a cached fragment:

 - cache :key=>"news" do    
   %h2 News
   - etc

I have a sweeper that uses:

def expire_home_cache
  puts "expire_home_cache"
  expire_fragment(:key => "news") 
end

The sweeper is called as I can see "expire_home_cache" in the console output.

But the fragment is not updated ...

Any ideas?

A: 

Race condition?

Cody Caughlan
I am not sure what you mean?
Toby Hede
+1  A: 

You might try this:

   cache("news") do    
     %h2 News
     - etc
   end

and...

def expire_home_cache
  puts "expire_home_cache"
  expire_fragment("news") 
end

...or try this ...

 - cache({:key=>"news"}) do    
   %h2 News
   - etc

I am thinking the issue may be that ruby or rails is having a hard time determining what the key is exactly and so the cache method and expire_fragment are generating two different cache keys.

dave elkins
+1  A: 

Try replacing expire_fragment(:key => "news") with ActionController::Base.new.expire_fragment(:key => "news")

No time to explain, but it worked for me.

Wish I could upvote this more ... worked like a charm!
concept47
Make sure you put --- cache_sweeper :whatever_sweeper --- in your application_controller.rb, for the above to work.
concept47
A: 

This doesn't directly answer your question, but have you tried the timed_fragment_cache plugin as an alternative?

http://github.com/tricycle/timed_fragment_cache/tree/master

I found this to be a much simpler way of expiring fragments in my projects.

tmarkiewicz
A: 

The proper way to do this is:

cache :news do

  ...
end

And then in your sweeper:

expire_fragment :news
Mark S.
So the key should be a symbol, not a string?
Toby Hede
You can make it a string, or a symbol, but it doesn't need to be a hash.
Mark S.