ViewComponent/view_component · error · ViewComponent::HelpersCalledBeforeRenderError
`#helpers` can't be used before rendering as it depends on t
Error message
`#helpers` can't be used before rendering as it depends on the view context that only exists once a ViewComponent is passed to the Rails render pipeline. It's sometimes possible to fix this issue by moving code dependent on `#helpers` to a [`#before_render` method](https://viewcomponent.org/api.html#before_render--void).
What it means
Error "`#helpers` can't be used before rendering as it depends on the view context that only exists once a ViewComponent is passed to the Rails render pipeline. It's sometimes possible to fix this issue by moving code dependent on `#helpers` to a [`#before_render` method](https://viewcomponent.org/api.html#before_render--void)." thrown in ViewComponent/view_component.
Source
Thrown at lib/view_component/base.rb:326
@output_buffer = old_output_buffer
end
# The current controller. Use sparingly as doing so introduces coupling
# that inhibits encapsulation & reuse, often making testing difficult.
#
# @return [ActionController::Base]
def controller
raise ControllerCalledBeforeRenderError if view_context.nil?
@__vc_controller ||= view_context.controller
end
# A proxy through which to access helpers. Use sparingly as doing so introduces
# coupling that inhibits encapsulation & reuse, often making testing difficult.
#
# @return [ActionView::Base]
def helpers
raise HelpersCalledBeforeRenderError if view_context.nil?
# Attempt to re-use the original view_context passed to the first
# component rendered in the rendering pipeline. This prevents the
# instantiation of a new view_context via `controller.view_context` which
# always returns a new instance of the view context class.
#
# This allows ivars to remain persisted when using the same helper via
# `helpers` across multiple components and partials.
@__vc_helpers ||= __vc_original_view_context || controller.view_context
end
if defined?(Rails.env) && (::Rails.env.development? || ::Rails.env.test?)
# @private
def method_missing(method_name, *args) # rubocop:disable Style/MissingRespondToMissing
super
rescue => e # rubocop:disable Style/RescueStandardError
e.set_backtrace e.backtrace.tap(&:shift)
raise e, <<~MESSAGE.chomp if view_context && e.is_a?(NameError) && helpers.respond_to?(method_name)View on GitHub (pinned to 9f22c36fa7)
Solutions
- Move code that calls `#helpers` into a `#before_render` method or the template, where the view context is available.
- Alternatively include the needed helper module directly into the component class and call it without going through `#helpers`.
When it happens
Trigger: Thrown at lib/view_component/base.rb:326 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of ViewComponent/view_component@9f22c36fa7 (2026-08-23).
Data as JSON: /api/errors/bc6248637283d21d.
Report an issue: GitHub.