class ViewComponentLiquid::FileSystem

Attributes

view[R]

Public Class Methods

new(view) click to toggle source
# File lib/view_component_liquid/file_system.rb, line 6
def initialize(view)
  @view = view
end

Public Instance Methods

read_template_file(template_path) click to toggle source
# File lib/view_component_liquid/file_system.rb, line 10
def read_template_file(template_path)
  controller_path = view.controller_path

  template_name = File.basename(template_path)
  template_folders = unless template_path.include?("/")
                       [
                         "",
                         controller_path,
                         "application",
                         "shared"
                       ]
                     else
                      [File.dirname(template_path)]
                     end

  # Search Rails' configured view paths first
  result = view.view_paths.find_all(
    template_name,
    template_folders,
    true,
    lookup_details
  )

  if result.present?
    LiquidComponent.parse(result.first.source).content
  else
    # Time to look through autoload paths for component folders
    components_folders = Zeitwerk::Loader.all_dirs.select {|item| item.ends_with?("_components")}

    template = nil

    components_folders.each do |components_folder|
      tmpl = components_folder + "/#{template_path}.liquid"
      if File.exist?(tmpl)
        template = LiquidComponent.parse(File.read(tmpl)).content
        break
      end
    end

    template.presence || raise(ActionView::MissingTemplate.new(template_folders + components_folders, template_name, template_folders, false, "liquid views"))
  end
end

Private Instance Methods

lookup_details() click to toggle source
# File lib/view_component_liquid/file_system.rb, line 57
def lookup_details
  {
    locale:   [view.locale, :en],
    formats:  view.formats,
    variants: [],
    handlers: [:liquid],
    versions: []
  }
end