I was troubleshooting a data issue in a production environment. It wasn’t heroku, rather a rails environment hosted on AWS. It was Rails 4.2, ruby 2.2.3.
First off, it’s worth noting that there were two or three bugs that were commingled and causing issues for our client. A number of folks had spent a long time trying to troubleshoot the issue. At this point, I was tasked with taking a look and had access to all the environments. The problem only seemed to appear on production, and appeared to be a data issue. I was editing views directly on production to track down where the data issue appeared, as well as running queries on the production database and using the rails console to see what rails thought was happening. In other words, it was a hot mess. However, this debugging story isn’t the point of this post. Rather, I ran into the most peculiar situation and wanted to document it so that if I ever ran into it in the future, I would remember it.
Basically, I had a view that looked something like this:
text <% cache('[key]') %> other text <% end %>
I changed text
to be new text
which included some useful debugging information. Debugged the problem and went on my merry way. The next day, early, I realized that I hadn’t changed it back, so logged back into prod and changed it back to text
. Reloaded the page and didn’t see the change. What? Tried to clear the cache using the rails console and Rails.cache.delete()
. No change.
After lots of googling, I realized that the view text, outside of cache tags, is cached in some other fashion. I finally figured out how to reset the cache by following these steps:
- edit
config/environments/production.rb
- set
config.cache_classes=false
- restart passenger by touching
tmp/restart.txt
(see here for more on that) - reload the page, and now I could see
text
instead ofnew text
- set
config.cache_classes=true
- restart passenger by touching
tmp/restart.txt
This only happens when you both have a mutable production environment and are changing the view files in that environment. This won’t occur if you were using a platform like Heroku, or if you never troubleshot on production.