How ViewComponent Works
At application boot
When ViewComponent::Base
is inherited from, ViewComponent::Compiler.compile
compiles a component’s template(s) into instance method(s) on the component:
class MyComponent < ViewComponent::Base
end
<%= Time.now %>
Compiles to:
class MyComponent < ViewComponent::Base
def _call_my_component
@output_buffer.append = (Time.now)
@output_buffer
end
end
At component instantiation
Component initializer runs if defined. ViewComponent does not perform any actions.
At render
When a ViewComponent is passed to render
, Rails calls render_in
, passing the current ActionView::Context. ActionView::Context
is used to provide access to the current controller, request, and helpers, which is why they cannot be referenced until a component is rendered.
First, ViewComponent calls the before_render
method, which gives ViewComponents the opportunity to execute logic before render time but after initialization.
Second, ViewComponent calls render?
, returning early with an empty string if render?
returns false.
ViewComponent then renders the component template.