class Komponent::ComponentRenderer

Attributes

context[R]
output_buffer[RW]

Public Class Methods

new(controller) click to toggle source
# File lib/komponent/component_renderer.rb, line 10
def initialize(controller)
  @context = controller.view_context.dup
  @view_renderer = @context.view_renderer = @context.view_renderer.dup
  @lookup_context = @view_renderer.lookup_context = @view_renderer.lookup_context.dup
end

Public Instance Methods

render(component, locals = {}, options = {}, &block) click to toggle source
# File lib/komponent/component_renderer.rb, line 16
def render(component, locals = {}, options = {}, &block)
  cached = options.delete(:cached)
  if cached

    cached_block = block ? block.call : nil
    key = [component, locals, options, cached_block].to_s
    cache_key = Digest::SHA1.hexdigest(key)

    Rails.cache.fetch(cache_key) do
      _render(component, locals, options, &block)
    end
  else
    _render(component, locals, options, &block)
  end
end

Private Instance Methods

_render(component, locals = {}, options = {}, &block) click to toggle source
# File lib/komponent/component_renderer.rb, line 34
def _render(component, locals = {}, options = {}, &block)
  parts = component.split("/")
  component_name = parts.join("_")

  component_module_path = resolved_component_path(component)
    .join("#{component_name}_component")
  require_dependency(component_module_path)
  component_module = "#{component_name}_component".camelize.constantize

  @context.class_eval { prepend component_module }
  @context.class_eval { prepend Komponent::Translation }

  @lookup_context.prefixes = ["components/#{component}"]

  @context.instance_eval do
    if component_module.respond_to?(:properties)
      locals = locals.dup
      component_module.properties.each do |name, options|
        unless locals.has_key?(name)
          if options.has_key?(:default)
            locals[name] = options[:default]
          elsif options[:required]
            raise "Missing required component parameter: #{name}"
          end
        end
      end
    end

    locals.each do |name, value|
      instance_variable_set(:"@#{name}", locals[name])
    end

    define_singleton_method(:properties) { locals }
    define_singleton_method(:block_given_to_component?) { block_given? }
    define_singleton_method(:block_given_to_component) { block }
  end

  @context.render("components/#{component}/#{parts.join('_')}", &block)
end
resolved_component_path(component) click to toggle source
# File lib/komponent/component_renderer.rb, line 74
def resolved_component_path(component)
  Komponent::ComponentPathResolver.new.resolve(component)
end