Class: ViewComponent::SlotV2

Inherits:
Object
  • Object
show all
Defined in:
lib/view_component/slot_v2.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parent) ⇒ SlotV2

Returns a new instance of SlotV2.



7
8
9
# File 'lib/view_component/slot_v2.rb', line 7

def initialize(parent)
  @parent = parent
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args, &block) ⇒ Object

Allow access to public component methods via the wrapper

e.g.

calling ‘header.name` (where `header` is a slot) will call `name` on the `HeaderComponent` instance.

Where the component may look like:

class MyComponent < ViewComponent::Base

has_one :header, HeaderComponent

class HeaderComponent < ViewComponent::Base
  def name
    @name
  end
end

end



57
58
59
# File 'lib/view_component/slot_v2.rb', line 57

def method_missing(symbol, *args, &block)
  @_component_instance.public_send(symbol, *args, &block)
end

Instance Attribute Details

#_component_instance=(value) ⇒ Object (writeonly)

Sets the attribute _component_instance

Parameters:

  • value

    the value to set the attribute _component_instance to.



5
6
7
# File 'lib/view_component/slot_v2.rb', line 5

def _component_instance=(value)
  @_component_instance = value
end

#_content=(value) ⇒ Object (writeonly)

Sets the attribute _content

Parameters:

  • value

    the value to set the attribute _content to.



5
6
7
# File 'lib/view_component/slot_v2.rb', line 5

def _content=(value)
  @_content = value
end

#_content_block=(value) ⇒ Object (writeonly)

Sets the attribute _content_block

Parameters:

  • value

    the value to set the attribute _content_block to.



5
6
7
# File 'lib/view_component/slot_v2.rb', line 5

def _content_block=(value)
  @_content_block = value
end

Instance Method Details

#respond_to_missing?(symbol, include_all = false) ⇒ Boolean

Returns:

  • (Boolean)


61
62
63
# File 'lib/view_component/slot_v2.rb', line 61

def respond_to_missing?(symbol, include_all = false)
  @_component_instance.respond_to?(symbol, include_all)
end

#to_sObject

Used to render the slot content in the template

There’s currently 3 different values that may be set, that we can render.

If the slot renderable is a component, the string class name of a component, or a function that returns a component, we render that component instance, returning the string.

If the slot renderable is a function and returns a string, it is set as ‘@_content` and is returned directly.

If there is no slot renderable, we evaluate the block passed to the slot and return it.



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/view_component/slot_v2.rb', line 24

def to_s
  if defined?(@_component_instance)
    # render_in is faster than `parent.render`
    @_component_instance.render_in(
      @parent.send(:view_context),
      &@_content_block
    )
  elsif defined?(@_content)
    @_content
  elsif defined?(@_content_block)
    @_content_block.call
  end
end