One problem that tripped me up with http caching in rails was invalidating client http caches when a template changes and you're doing conditional etags based on an object's updated at timestamp. So basically when you do fresh_when(object), your rails app basically will only tell an http client this thing is stale if the object's updated_at timestamp changes. It doesn't take into account if the actually view code changes. Even worse, when your assets get recompiled (app-123.css is now app-234.css) and the old ones don't exist anymore, your app breaks.
I wrote about a way to fix that with a little gem I made:
http://ninjasandrobots.com/rails-caching-a-problem-with-etag...