diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 434f63c82..701997039 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,10 @@ nav_order: 6 ## main +* Allow I18n calls in `render?`. + + *23tux* + * ViewComponent now works without `rails` and `railties` gems loaded, enabling compatibility with Bridgetown 2.0. *Tom Lord* diff --git a/lib/view_component/base.rb b/lib/view_component/base.rb index 2aa924b99..68f15b244 100644 --- a/lib/view_component/base.rb +++ b/lib/view_component/base.rb @@ -131,6 +131,7 @@ def render_in(view_context, &block) @__vc_content_evaluated = false @__vc_render_in_block = block + @view_context.instance_variable_set(:@virtual_path, virtual_path) before_render @@ -138,8 +139,6 @@ def render_in(view_context, &block) value = nil @output_buffer.with_buffer do - @view_context.instance_variable_set(:@virtual_path, virtual_path) - rendered_template = around_render do render_template_for(@__vc_requested_details).to_s diff --git a/test/sandbox/config/locales/en.yml b/test/sandbox/config/locales/en.yml index 7a4c5f897..dbc82b91a 100644 --- a/test/sandbox/config/locales/en.yml +++ b/test/sandbox/config/locales/en.yml @@ -24,3 +24,7 @@ en: my_component: message: "OH NO! (you shouldn't see me)" + + rendering_test: + i18n_test_component: + message: "I can be called in render?" diff --git a/test/sandbox/test/rendering_test.rb b/test/sandbox/test/rendering_test.rb index 2b2add132..343cfaef3 100644 --- a/test/sandbox/test/rendering_test.rb +++ b/test/sandbox/test/rendering_test.rb @@ -1344,4 +1344,25 @@ def test_render_partial_with_yield_and_method_call render_inline(PartialWithYieldAndMethodCallComponent.new) assert_text "hello world", exact: true, normalize_ws: true end + + class I18nTestComponent < ViewComponent::Base + def message + t(".message") + end + + def render? + message + end + + def call + content_tag :div, t(".message") + end + end + + def test_i18n_in_render_hook + vc_test_request.params[:hello] = "world" + render_inline(I18nTestComponent.new) + + assert_selector("div", text: I18n.t("rendering_test.i18n_test_component.message")) + end end