Class: ViewComponent::SlotV2
- Inherits:
-
Object
- Object
- ViewComponent::SlotV2
- Includes:
- WithContentHelper
- Defined in:
- lib/view_component/slot_v2.rb
Instance Attribute Summary collapse
-
#__vc_component_instance ⇒ Object
writeonly
Sets the attribute __vc_component_instance.
-
#__vc_content ⇒ Object
writeonly
Sets the attribute __vc_content.
-
#__vc_content_block ⇒ Object
writeonly
Sets the attribute __vc_content_block.
Instance Method Summary collapse
- #html_safe? ⇒ Boolean
-
#initialize(parent) ⇒ SlotV2
constructor
A new instance of SlotV2.
-
#method_missing(symbol, *args, &block) ⇒ Object
Allow access to public component methods via the wrapper.
- #respond_to_missing?(symbol, include_all = false) ⇒ Boolean
-
#to_s ⇒ Object
Used to render the slot content in the template.
Methods included from WithContentHelper
Constructor Details
#initialize(parent) ⇒ SlotV2
Returns a new instance of SlotV2.
11 12 13 |
# File 'lib/view_component/slot_v2.rb', line 11 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
for example
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
85 86 87 |
# File 'lib/view_component/slot_v2.rb', line 85 def method_missing(symbol, *args, &block) @__vc_component_instance.public_send(symbol, *args, &block) end |
Instance Attribute Details
#__vc_component_instance=(value) ⇒ Object (writeonly)
Sets the attribute __vc_component_instance
9 10 11 |
# File 'lib/view_component/slot_v2.rb', line 9 def __vc_component_instance=(value) @__vc_component_instance = value end |
#__vc_content=(value) ⇒ Object (writeonly)
Sets the attribute __vc_content
9 10 11 |
# File 'lib/view_component/slot_v2.rb', line 9 def __vc_content=(value) @__vc_content = value end |
#__vc_content_block=(value) ⇒ Object (writeonly)
Sets the attribute __vc_content_block
9 10 11 |
# File 'lib/view_component/slot_v2.rb', line 9 def __vc_content_block=(value) @__vc_content_block = value end |
Instance Method Details
#html_safe? ⇒ Boolean
90 91 92 |
# File 'lib/view_component/slot_v2.rb', line 90 def html_safe? to_s.html_safe? end |
#respond_to_missing?(symbol, include_all = false) ⇒ Boolean
94 95 96 |
# File 'lib/view_component/slot_v2.rb', line 94 def respond_to_missing?(symbol, include_all = false) defined?(@__vc_component_instance) && @__vc_component_instance.respond_to?(symbol, include_all) end |
#to_s ⇒ Object
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’s set as ‘@__vc_content` and is returned directly.
If there is no slot renderable, we evaluate the block passed to the slot and return it.
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/view_component/slot_v2.rb', line 28 def to_s return @content if defined?(@content) view_context = @parent.send(:view_context) if defined?(@__vc_content_block) && defined?(@__vc_content_set_by_with_content) raise ArgumentError.new( "It looks like a block was provided after calling `with_content` on #{self.class.name}, " \ "which means that ViewComponent doesn't know which content to use.\n\n" \ "To fix this issue, use either `with_content` or a block." ) end @content = if defined?(@__vc_component_instance) @__vc_component_instance.__vc_original_view_context = @parent.__vc_original_view_context if defined?(@__vc_content_set_by_with_content) @__vc_component_instance.with_content(@__vc_content_set_by_with_content) @__vc_component_instance.render_in(view_context) elsif defined?(@__vc_content_block) # render_in is faster than `parent.render` @__vc_component_instance.render_in(view_context, &@__vc_content_block) else @__vc_component_instance.render_in(view_context) end elsif defined?(@__vc_content) @__vc_content elsif defined?(@__vc_content_block) view_context.capture(&@__vc_content_block) elsif defined?(@__vc_content_set_by_with_content) @__vc_content_set_by_with_content end @content = @content.to_s end |