diff --git a/lib/phlex/rails/buffered.rb b/lib/phlex/rails/buffered.rb index de1f475..ef1f7c7 100644 --- a/lib/phlex/rails/buffered.rb +++ b/lib/phlex/rails/buffered.rb @@ -50,7 +50,7 @@ def respond_to_missing?(...) def method_missing(*args, **kwargs, &block) output = if block - @object.public_send(*args, **kwargs) { @view.capture(&block) } + @object.public_send(*args, **kwargs) { |*a| @view.capture(*a, &block) } else @object.public_send(*args, **kwargs) end diff --git a/lib/phlex/rails/sgml.rb b/lib/phlex/rails/sgml.rb index 4930ea5..90be538 100644 --- a/lib/phlex/rails/sgml.rb +++ b/lib/phlex/rails/sgml.rb @@ -30,7 +30,13 @@ def render(*args, **kwargs, &block) return super unless renderable.is_a?(ActiveRecord::Relation) else if block - @_context.target << @_view_context.render(*args, **kwargs) { capture(&block) } + @_context.target << @_view_context.render(*args, **kwargs) do |*yielded_args| + if yielded_args.length == 1 && defined?(ViewComponent::Base) && ViewComponent::Base === yielded_args[0] + capture(Phlex::Rails::Buffered.new(yielded_args[0], view: self), &block) + else + capture(*yielded_args, &block) + end + end else @_context.target << @_view_context.render(*args, **kwargs) end @@ -70,7 +76,7 @@ def render_in(view_context, &block) end end - def capture + def capture(...) super&.html_safe end diff --git a/test/dummy/app/views/rendering/vc_component.html.erb b/test/dummy/app/views/rendering/vc_component.html.erb new file mode 100644 index 0000000..23a8e61 --- /dev/null +++ b/test/dummy/app/views/rendering/vc_component.html.erb @@ -0,0 +1,2 @@ + +<%= slot %> diff --git a/test/dummy/app/views/rendering/vc_component.rb b/test/dummy/app/views/rendering/vc_component.rb index 1376a57..d6ef399 100644 --- a/test/dummy/app/views/rendering/vc_component.rb +++ b/test/dummy/app/views/rendering/vc_component.rb @@ -3,11 +3,5 @@ module Rendering class VcComponent < ViewComponent::Base renders_one :slot - - def call - if slot? - slot - end - end end end diff --git a/test/dummy/app/views/rendering/view_component_from_phlex.rb b/test/dummy/app/views/rendering/view_component_from_phlex.rb index 80b8a07..e17ea76 100644 --- a/test/dummy/app/views/rendering/view_component_from_phlex.rb +++ b/test/dummy/app/views/rendering/view_component_from_phlex.rb @@ -3,11 +3,15 @@ module Rendering class ViewComponentFromPhlex < ApplicationView def view_template + h1 { "Before" } + render VcComponent.new do |component| - component.slot do - h1 { "Rendered from Phlex" } + component.with_slot do + h1(id: "phlex") { "Rendered from Phlex" } end end + + h1 { "After" } end end end diff --git a/test/phlex/render_test.rb b/test/phlex/render_test.rb index 17f0edb..fdc30e9 100644 --- a/test/phlex/render_test.rb +++ b/test/phlex/render_test.rb @@ -12,5 +12,6 @@ class RenderTest < ActionDispatch::IntegrationTest test "rendering view_component component from Phlex view" do get "/rendering/view_component_from_phlex" assert_response :success + assert_select "#phlex", "Rendered from Phlex" end end