Skip to Content Skip to Search

Action View Dependency Tracker

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.

Namespace
Methods
R

Class Public methods

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.

# 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