Russian doll caching helps speed up web pages by saving parts of the page separately. When something changes, only the changed parts reload, not the whole page.
You have a page with many parts that update at different times.
You want to avoid reloading the entire page when only a small part changes.
You want to improve your website's speed by caching nested content.
You have a list of items where each item can change independently.
You want to reduce server work by reusing cached pieces inside bigger caches.
Syntax
Ruby on Rails
<%= cache @post do %>
<h2><%= @post.title %></h2>
<%= cache @post.comments do %>
<%= render @post.comments %>
<% end %>
<% end %>
Use cache helper with an object or key to create a cache block.
Nested cache blocks create the 'Russian doll' effect, caching inner parts separately.
Examples
Caches the whole article block. If the article changes, the cache updates.
Ruby on Rails
<%= cache @article do %>
<h1><%= @article.title %></h1>
<p><%= @article.body %></p>
<% end %>
Caches the article and separately caches its comments. Comments cache updates only when comments change.
Ruby on Rails
<%= cache @article do %>
<h1><%= @article.title %></h1>
<%= cache @article.comments do %>
<%= render @article.comments %>
<% end %>
<% end %>
Caches using a custom key array including timestamp to expire cache when user updates.
Ruby on Rails
<%= cache ['user', user.id, user.updated_at] do %>
<p><%= user.name %></p>
<% end %>
Sample Program
This example caches the post content and its comments separately. If the post changes, the whole cache updates. If only comments change, only the comments cache updates, saving time.
Ruby on Rails
<!-- app/views/posts/show.html.erb -->
<%= cache @post do %>
<h2><%= @post.title %></h2>
<p><%= @post.body %></p>
<h3>Comments</h3>
<%= cache @post.comments do %>
<ul>
<% @post.comments.each do |comment| %>
<li><%= comment.body %> - <em><%= comment.author %></em></li>
<% end %>
</ul>
<% end %>
<% end %>
OutputSuccess
Important Notes
Make sure the objects used in cache have a reliable cache_key or use a custom key with timestamps.
Russian doll caching works best when nested parts change independently.
Use Rails development logs or tools like rails dev:cache to check cache hits and misses.
Summary
Russian doll caching caches nested parts of a page separately.
It speeds up pages by only updating changed parts.
Use nested cache blocks with objects or keys to implement it.
Practice
(1/5)
1. What is the main purpose of Russian doll caching in Rails?
easy
A. To cache nested parts of a page separately for faster updates
B. To cache the entire page as a single block
C. To disable caching for nested components
D. To cache only the database queries
Solution
Step 1: Understand caching scope
Russian doll caching caches nested parts of a page separately, not the whole page at once.
Step 2: Identify the benefit
This allows only changed parts to be updated, speeding up page rendering.
Final Answer:
To cache nested parts of a page separately for faster updates -> Option A
Quick Check:
Russian doll caching = nested caching [OK]
Hint: Think nested caching updates only changed parts [OK]
Common Mistakes:
Confusing with full page caching
Thinking it disables caching
Assuming it caches only queries
2. Which syntax correctly uses Russian doll caching in a Rails view?
easy
A. <% cache @post do %> <% cache @comment do %> ... <% end %> <% end %>
B. <% cache do @post, @comment %> ... <% end %>
C. <% cache @post + @comment do %> ... <% end %>
D. <% cache @post && @comment do %> ... <% end %>
Solution
Step 1: Check nested cache blocks
Russian doll caching uses nested cache blocks for each object separately.
Step 2: Validate syntax correctness
<% cache @post do %> <% cache @comment do %> ... <% end %> <% end %> correctly nests cache @post and inside it cache @comment blocks.
Final Answer:
<% cache @post do %> <% cache @comment do %> ... <% end %> <% end %> -> Option A
Quick Check:
Nested cache blocks = correct syntax [OK]
Hint: Look for nested cache blocks with separate objects [OK]
Common Mistakes:
Trying to cache multiple objects in one block incorrectly
Using operators like + or && inside cache call
Not nesting cache blocks properly
3. Given this Rails view code snippet, what will happen when @comment is updated but @post is unchanged?
<% cache @post do %>
<p>Post content</p>
<% cache @comment do %>
<p>Comment content</p>
<% end %>
<% end %>
medium
A. Both post and comment caches are expired and re-rendered
B. Only the comment cache is expired and re-rendered
C. Only the post cache is expired and re-rendered
D. Neither cache is expired; page stays the same
Solution
Step 1: Understand cache dependencies
Russian doll caching nests caches so inner caches expire independently from outer caches.
Step 2: Apply update effect
Updating @comment expires only the comment cache, not the post cache.
Final Answer:
Only the comment cache is expired and re-rendered -> Option B
Quick Check:
Inner cache update = inner cache expired [OK]
Hint: Only changed nested cache re-renders, outer stays [OK]
Common Mistakes:
Assuming outer cache always expires with inner
Thinking no cache expires on update
Confusing which cache block is affected
4. Identify the error in this Rails view code using Russian doll caching:
<% cache @post do %>
<p>Post content</p>
<% cache @comment %>
<p>Comment content</p>
<% end %>
<% end %>
medium
A. Extra end keyword causing syntax error
B. Nested cache blocks cannot be used
C. Incorrect variable names for caching
D. Missing block for inner cache call
Solution
Step 1: Check inner cache syntax
The inner cache @comment call lacks a block (no do ... end).
Step 2: Understand block requirement
Cache calls must have a block to define cached content; missing block causes error.
Final Answer:
Missing block for inner cache call -> Option D
Quick Check:
Cache calls need blocks [OK]
Hint: Always use do ... end with cache blocks [OK]
Common Mistakes:
Omitting block for cache call
Misplacing end keywords
Assuming cache works without block
5. You want to implement Russian doll caching for a blog page with posts and comments. Which approach best ensures only changed comments or posts update their cache without re-rendering the whole page?
hard
A. Use cache @post.comments once for all comments without nesting
B. Cache the entire blog page in one cache block with a combined key
C. Nest cache @post do blocks around each post and inside nest cache comment do blocks for each comment
D. Disable caching for comments and cache only posts
Solution
Step 1: Understand nested caching strategy
Russian doll caching works best by nesting cache blocks for each object separately.
Step 2: Apply to posts and comments
Wrapping each post in a cache block and nesting comment cache blocks inside allows independent expiration.
Step 3: Evaluate other options
Other options either cache too broadly or disable caching, losing efficiency.
Final Answer:
Nest cache @post do blocks around each post and inside nest cache comment do blocks for each comment -> Option C
Quick Check:
Nested cache blocks for each object = best practice [OK]
Hint: Nest cache blocks per object for fine-grained updates [OK]
Common Mistakes:
Caching entire page at once
Caching all comments together without nesting
Disabling caching for parts
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.