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

.find_dependencies(name, template, view_paths = nil)

This method is for internal use only.
[ GitHub ]

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

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 50

def self.register_tracker(extension, tracker)
  handler = Template.handler_for_extension(extension)
  if tracker.respond_to?(:supports_view_paths?)
    @trackers[handler] = tracker
  else
    @trackers[handler] = lambda { |name, template, _|
      tracker.call(name, template)
    }
  end
end

.remove_tracker(handler)

This method is for internal use only.
[ GitHub ]

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

def self.remove_tracker(handler) # :nodoc:
  @trackers.delete(handler)
end