Module: ViewComponentSubtemplates::CompilerExtension

Defined in:
lib/view_component_subtemplates/compiler_extension.rb

Overview

Extends ViewComponent’s compilation process to handle subtemplates.

Class Method Summary collapse

Class Method Details

.gather_sub_templates_for(component_class) ⇒ Array<SubTemplate>

Discovers subtemplate files in the component’s subdirectory.

Parameters:

  • component_class (Class)

    the component class

Returns:

  • (Array<SubTemplate>)

    array of subtemplate objects



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/view_component_subtemplates/compiler_extension.rb', line 22

def self.gather_sub_templates_for(component_class)
  component_subdir = ViewComponentSubtemplates.component_subdir_for(component_class)
  return [] unless Dir.exist?(component_subdir)

  template_extensions = ActionView::Template.template_handler_extensions

  Dir.glob(File.join(component_subdir, "*")).filter_map do |file_path|
    next unless File.file?(file_path)
    next unless template_extensions.include?(File.extname(file_path)[1..])

    template_name = File.basename(file_path).split(".").first

    SubTemplate.new(
      component: component_class,
      path: file_path,
      template_name: template_name
    )
  end
end

.process_component(component_class) ⇒ void

This method returns an undefined value.

Compiles all subtemplates for a component into call_* methods. Skips processing if already done for this component.

Parameters:

  • component_class (Class)

    the component class to process



11
12
13
14
15
16
# File 'lib/view_component_subtemplates/compiler_extension.rb', line 11

def self.process_component(component_class)
  return if component_class.instance_variable_get(:@__subtemplates_processed)

  gather_sub_templates_for(component_class).each(&:compile_to_component)
  component_class.instance_variable_set(:@__subtemplates_processed, true)
end