Skip to content

Commit 750d1d3

Browse files
committed
Add cache refistry and alighn cache with how action view does it
1 parent d29c66d commit 750d1d3

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

lib/view_component/cache_registry.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module CachingRegistry # :nodoc:
2+
extend self
3+
4+
def caching?
5+
ActiveSupport::IsolatedExecutionState[:action_view_caching] ||= false
6+
end
7+
8+
def track_caching
9+
caching_was = ActiveSupport::IsolatedExecutionState[:action_view_caching]
10+
ActiveSupport::IsolatedExecutionState[:action_view_caching] = true
11+
12+
yield
13+
ensure
14+
ActiveSupport::IsolatedExecutionState[:action_view_caching] = caching_was
15+
end
16+
end

lib/view_component/cacheable.rb

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require 'set'
4+
require 'view_component/cache_registry'
45

56
module ViewComponent::Cacheable
67
extend ActiveSupport::Concern
@@ -15,21 +16,50 @@ def view_cache_dependencies
1516
return if __vc_cache_dependencies.blank? || __vc_cache_dependencies.none? || __vc_cache_dependencies.nil?
1617

1718
computed_view_cache_dependencies = __vc_cache_dependencies.map { |dep| if respond_to?(dep) then public_send(dep) end }
18-
ActiveSupport::Cache.expand_cache_key(computed_view_cache_dependencies)
19+
combined_fragment_cache_key(ActiveSupport::Cache.expand_cache_key(computed_view_cache_dependencies))
1920
end
2021

2122
# Render component from cache if possible
2223
#
2324
# @private
2425
def __vc_render_cacheable(rendered_template)
2526
if __vc_cache_dependencies != [:format, :__vc_format]
26-
Rails.cache.fetch(view_cache_dependencies) do
27-
__vc_render_template(rendered_template)
27+
CachingRegistry.track_caching do
28+
template_fragment(rendered_template)
2829
end
2930
else
3031
__vc_render_template(rendered_template)
3132
end
3233
end
34+
35+
def template_fragment(rendered_template)
36+
if content = read_fragment(rendered_template)
37+
@view_renderer.cache_hits[@current_template&.virtual_path] = :hit if defined?(@view_renderer)
38+
content
39+
else
40+
@view_renderer.cache_hits[@current_template&.virtual_path] = :miss if defined?(@view_renderer)
41+
write_fragment(rendered_template)
42+
end
43+
end
44+
45+
def read_fragment(rendered_template)
46+
Rails.cache.fetch(view_cache_dependencies)
47+
end
48+
49+
def write_fragment(rendered_template)
50+
content = __vc_render_template(rendered_template)
51+
Rails.cache.fetch(view_cache_dependencies) do
52+
content
53+
end
54+
content
55+
end
56+
57+
def combined_fragment_cache_key(key)
58+
cache_key = [:view_component, ENV["RAILS_CACHE_ID"] || ENV["RAILS_APP_VERSION"], key]
59+
cache_key.flatten!(1)
60+
cache_key.compact!
61+
cache_key
62+
end
3363
end
3464

3565
class_methods do

0 commit comments

Comments
 (0)