123456789_123456789_123456789_123456789_123456789_

Class: ActionView::DependencyTracker

Overview

When the digestor builds a template's dependency tree (to compute the cache keys used by cache blocks and stale? checks), it asks the dependency tracker which other templates a given template renders.

Dependencies are tracked per template handler, because every template language spells render differently. Action View ships ERBTracker for ERB; handlers for other template languages register their own with .register_tracker, typically from an ActiveSupport.on_load(:action_view) block so it runs once Action View is available:

ActiveSupport.on_load(:action_view) do
ActionView::Template.register_template_handler :mtl, MyTemplateLanguage::Handler
ActionView::DependencyTracker.register_tracker :mtl, MyTemplateLanguage::DependencyTracker
end

Languages whose render calls look like Ruby's can register ERBTracker instead of writing their own tracker.

Class Method Summary

::ActiveSupport::Autoload - Extended

Class Method Details

.eager_load!

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/dependency_tracker.rb', line 79

def self.eager_load! # :nodoc:
  @trackers.freeze
end

.find_dependencies(name, template, view_paths = nil)

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/dependency_tracker.rb', line 35

def self.find_dependencies(name, template, view_paths = nil) # :nodoc:
  tracker = @trackers[template.handler]
  return [] unless tracker

  tracker.call(name, template, view_paths)
end

.register_tracker(extension, tracker)

Registers the tracker used to find the dependencies of templates rendered by the handler registered for extension.

tracker is any object that responds to call(name, template, view_paths) and returns the array of template names template depends on. An object responding only to call(name, template) is also accepted for backwards compatibility.

[ GitHub ]

  
# File 'actionview/lib/action_view/dependency_tracker.rb', line 49

def self.register_tracker(extension, tracker)
  handler = Template.handler_for_extension(extension)
  callable = if tracker.respond_to?(:supports_view_paths?)
    tracker
  else
    ActiveSupport::Ractors.try_shareable_proc { |name, template, _|
      tracker.call(name, template)
    }
  end

  if @trackers.frozen?
    ActionView.deprecator.warn(<<~MSG)
      Registering a dependency tracker after application initialization is deprecated.
      Register trackers from a Railtie or an initializer instead.
      This will raise a FrozenError in Rails 9.0.
    MSG
    @trackers = @trackers.merge(handler => callable).freeze
  else
    @trackers[handler] = callable
  end
end

.remove_tracker(handler)

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/dependency_tracker.rb', line 71

def self.remove_tracker(handler) # :nodoc:
  if @trackers.frozen?
    @trackers = @trackers.except(handler).freeze
  else
    @trackers.delete(handler)
  end
end

.share_registry

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/dependency_tracker.rb', line 83

def self.share_registry # :nodoc:
  ActiveSupport::Ractors.make_shareable(@trackers)
end