We often hear Cache invalidation is a hard problem in computer science and could cause bugs but sometimes, caching something that should not be cached is a potential source of bugs and security vulnerabilities. Rails has a built-in mechanism for Fragment Caching, which stores part of the rendered view as a fragment. For subsequent requests, the pre-saved fragment is used instead of rendering it again.
But this could cause some serious bugs! For example, we could have an S3 URL helper which generates a unique presigned URL for each product or one could write a form helper that outputs a request-specific auth token. In such cases, it is better to avoid fragment caching.
Before
We can implement fragment caching using the cache
helper.
views/products/index.html.erb
views/products/_product.html.erb
But there is a bug because
we get a cached version of the product each time we render
despite generating a unique presigned URL each time.
To resolve this,
we need to include cacheable
in the Product partial.
If someone tries to cache the product partial,
it will throw an ActionView::Template::Error
error.
After
which would result in,
We can also use the caching?
helper to check whether the current code path is being cached
or to enforce caching.
For more discussion related to this change, please refer to this PR.