Resetting the template or class cache in Rails 2.2.0

While testing the Rails 2.2.0 release I soon knew I had a problem: I'm relying on the fact that an ERB template is recompiled if the modification time of the file has been updated.

I work on a multisite Rails app, which uses 'request.host' to do a Site.find_by_domain and uses a before filter to call 'prepend_view_path("#{RAILS_ROOT}/themes/#{@site.domain}/templates"). It's also possible to upload a new theme for a specific site via an admin backend. It's comparable to Shopify, but instead of using Liquid it relies on Rails' templating mechanism.

The line of code that made this work is located here: http://github.com/rails/rails/tree/v2.1.2/actionpack/lib/action_view/template_handlers/compilable.rb#L70, but in rails-2.2.0 thing have been rewritten and the check is unfortunately gone: http://github.com/rails/rails/tree/v2.2.0/actionpack/lib/action_view/renderable.rb#L90.

Currently this means that I need to run this app in production with 'config.cache_classes = false' in order to upgrade to Rails 2.2.0, which reloads all application code on every requests. That's going to be slow. Another solution is restarting the whole app after changing the theme for a single site.

Is there a way for me to reset the template cache manually after a theme has been updated?

While testing the Rails 2.2.0 release I soon knew I had a problem: I'm relying on the fact that an ERB template is recompiled if the modification time of the file has been updated.

I work on a multisite Rails app, which uses 'request.host' to do a Site.find_by_domain and uses a before filter to call 'prepend_view_path("#{RAILS_ROOT}/themes/#{@site.domain}/templates"). It's also possible to upload a new theme for a specific site via an admin backend. It's comparable to Shopify, but instead of using Liquid it relies on Rails' templating mechanism.

The line of code that made this work is located here: http://github.com/rails/rails/tree/v2.1.2/actionpack/lib/action_view/template_handlers/compilable.rb#L70 , but in rails-2.2.0 thing have been rewritten and the check is unfortunately gone: http://github.com/rails/rails/tree/v2.2.0/actionpack/lib/action_view/renderable.rb#L90 .

Currently this means that I need to run this app in production with 'config.cache_classes = false' in order to upgrade to Rails 2.2.0, which reloads all application code on every requests. That's going to be slow. Another solution is restarting the whole app after changing the theme for a single site.

Is there a way for me to reset the template cache manually after a theme has been updated?

You could just override that recompile? method

Fred

Fred,

I think I could write a patch that will take the file modification date into consideration, but I'm also eager to know, why the check has actually been removed.

- Matthijs

My bet is that it isn't thread-safe. Two actions may check at the same time, both will get a "true" and both will try to update the cache.

I don't understand. If checking if a template has already been compiled is thread-safe, checking the modification date should also be thread-safe.

If thread safety is the issue here, would there be an option for me to reset all compiled templates at once?

Maybe you could remove the whole compliled templates folder.

After doing some git-bisect magic it seems I'm in some real trouble. Josh Peek intentionally disabled[1] the file modification time check.

@Mauricio, are you sure compiled templates are stored on disk?

[1] http://github.com/rails/rails/commit/ce5d958f8fe878465c0d2142991a2945ca8d3cd1