From 70bed0a051d3ee95c23203cb0389bf1ca0bfb4b0 Mon Sep 17 00:00:00 2001 From: Simon Fish Date: Fri, 11 Oct 2024 09:40:52 +0100 Subject: [PATCH] Derive strict_helpers_enabled from component-local config --- lib/view_component/base.rb | 12 +++++++++++- lib/view_component/config.rb | 5 ++++- test/sandbox/test/rendering_test.rb | 15 ++++++++++++++- test/test_helper.rb | 2 +- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/view_component/base.rb b/lib/view_component/base.rb index cda187cb0..e2d924b1d 100644 --- a/lib/view_component/base.rb +++ b/lib/view_component/base.rb @@ -233,7 +233,7 @@ def controller def helpers raise HelpersCalledBeforeRenderError if view_context.nil? - raise StrictHelperError if ViewComponent::Base.strict_helpers_enabled + raise StrictHelperError if !GlobalConfig.helpers_enabled || component_config.strict_helpers_enabled # 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 @@ -520,6 +520,16 @@ def inherited(child) # `compile` defines compile + if child.superclass == ViewComponent::Base + child.define_singleton_method(:component_config) do + @@component_config ||= Rails.application.config.view_component.component_defaults.inheritable_copy + end + else + child.define_singleton_method(:component_config) do + @@component_config ||= superclass.component_config.inheritable_copy + end + end + # Give the child its own personal #render_template_for to protect against the case when # eager loading is disabled and the parent component is rendered before the child. In # such a scenario, the parent will override ViewComponent::Base#render_template_for, diff --git a/lib/view_component/config.rb b/lib/view_component/config.rb index e93f4f63e..e6efa5f79 100644 --- a/lib/view_component/config.rb +++ b/lib/view_component/config.rb @@ -26,7 +26,10 @@ def defaults test_controller: "ApplicationController", default_preview_layout: nil, capture_compatibility_patch_enabled: false, - helpers_enabled: true + helpers_enabled: true, + component_defaults: ActiveSupport::InheritableOptions.new({ + strict_helpers_enabled: false + }) }) end diff --git a/test/sandbox/test/rendering_test.rb b/test/sandbox/test/rendering_test.rb index d18f90bb0..1d4eed3bb 100644 --- a/test/sandbox/test/rendering_test.rb +++ b/test/sandbox/test/rendering_test.rb @@ -1259,13 +1259,26 @@ def test_with_format render_inline(MultipleFormatsComponent.new) assert_equal(rendered_json["hello"], "world") + end end - def test_strict_helpers + # Since helpers_enabled is true by default, we assume that the converse case + # is covered. If that default changes, tests should generally be updated. + def test_helpers_proxy_raises_if_helpers_disabled with_helpers_enabled_config(false) do assert_raises ViewComponent::StrictHelperError do render_inline(HelpersProxyComponent.new) end end end + + def test_helpers_proxy_raises_if_strict_helpers_enabled + with_helpers_enabled_config(true) do + with_strict_helpers_config(true) do + assert_raises ViewComponent::StrictHelperError do + render_inline(HelpersProxyComponent.new) + end + end + end + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index e964927d0..69b412efa 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -179,7 +179,7 @@ def with_compiler_development_mode(mode) end def with_strict_helpers_config(enabled, &block) - with_config_option(:strict_helpers_enabled, enabled, &block) + with_config_option(:strict_helpers_enabled, enabled, config_entrypoint: Rails.application.config.view_component.component_defaults, &block) end def with_helpers_enabled_config(enabled, &block)