1
1
# frozen_string_literal: true
2
2
3
3
require 'set'
4
+ require 'view_component/cache_registry'
4
5
5
6
module ViewComponent ::Cacheable
6
7
extend ActiveSupport ::Concern
@@ -15,21 +16,50 @@ def view_cache_dependencies
15
16
return if __vc_cache_dependencies . blank? || __vc_cache_dependencies . none? || __vc_cache_dependencies . nil?
16
17
17
18
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 ) )
19
20
end
20
21
21
22
# Render component from cache if possible
22
23
#
23
24
# @private
24
25
def __vc_render_cacheable ( rendered_template )
25
26
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 )
28
29
end
29
30
else
30
31
__vc_render_template ( rendered_template )
31
32
end
32
33
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
33
63
end
34
64
35
65
class_methods do
0 commit comments