Class: ReactOnRailsPro::Cache

Inherits:
Object
  • Object
show all
Defined in:
lib/react_on_rails_pro/cache.rb

Class Method Summary collapse

Class Method Details

.base_cache_key(type, prerender: nil) ⇒ Object

Cache keys by React on Rails Pro should build upon this base Provide prerender: true in order to include bundle hash in the list of keys. The bundle hash is necessary so that any changes to the bundle fault the cache.



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/react_on_rails_pro/cache.rb', line 44

def base_cache_key(type, prerender: nil)
  keys = [
    type,
    ReactOnRails::VERSION,
    ReactOnRailsPro::VERSION
  ]

  # TODO: Move comment over to test
  # We only care about the bundle hash if prerendering because we're not caching anything
  # that would be generated by the bundle.
  keys.push(ReactOnRailsPro::Utils.bundle_hash) if prerender
  keys
end

.dependencies_cache_keyObject



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/react_on_rails_pro/cache.rb', line 58

def dependencies_cache_key
  # https://github.com/shakacode/react_on_rails_pro/issues/32
  # https://github.com/shakacode/react_on_rails/issues/39#issuecomment-143472325
  return @dependency_checksum if @dependency_checksum.present? && !Rails.env.development?
  return nil unless ReactOnRailsPro.configuration.dependency_globs.present?

  @dependency_checksum =
    ReactOnRailsPro::Utils.digest_of_globs(
      ReactOnRailsPro.configuration.dependency_globs
    ).hexdigest
end

.fetch_react_component(component_name, options) ⇒ Object

options can include :compress, :expires_in, :race_condition_ttl and other options



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/react_on_rails_pro/cache.rb', line 10

def fetch_react_component(component_name, options)
  if use_cache?(options)
    cache_key = react_component_cache_key(component_name, options)
    Rails.logger.debug { "React on Rails Pro cache_key is #{cache_key.inspect}" }
    cache_options = options[:cache_options]
    cache_hit = true
    result = Rails.cache.fetch(cache_key, cache_options) do
      cache_hit = false
      yield
    end
    # Pass back the cache key in the results only if the result is a Hash
    if result.is_a?(Hash)
      result[:RORP_CACHE_KEY] = cache_key
      result[:RORP_CACHE_HIT] = cache_hit
    end
    result
  else
    yield
  end
end

.react_component_cache_key(component_name, options) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/react_on_rails_pro/cache.rb', line 70

def react_component_cache_key(component_name, options)
  cache_key_option = options[:cache_key]
  cache_key_value = if cache_key_option.respond_to?(:call)
                      cache_key_option.call
                    else
                      cache_key_option
                    end

  # NOTE: Rails seems to do this automatically: ActiveSupport::Cache.expand_cache_key(keys)
  [
    *base_cache_key("ror_component", prerender: options[:prerender]),
    dependencies_cache_key,
    component_name,
    cache_key_value
  ].compact
end

.use_cache?(options) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
39
# File 'lib/react_on_rails_pro/cache.rb', line 31

def use_cache?(options)
  if options.key?(:if)
    options[:if]
  elsif options.key?(:unless)
    !options[:unless]
  else
    true
  end
end