From 7458c4dde5dfbbafce378f7e24e509c108448645 Mon Sep 17 00:00:00 2001 From: Joel Drapper Date: Fri, 6 Sep 2024 22:35:25 +0100 Subject: [PATCH] Require long-form partial rendering --- lib/phlex/rails/sgml.rb | 56 ++++++++----------- .../app/views/rendering/partial_from_phlex.rb | 2 +- 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/lib/phlex/rails/sgml.rb b/lib/phlex/rails/sgml.rb index 792504b..48b1cf1 100644 --- a/lib/phlex/rails/sgml.rb +++ b/lib/phlex/rails/sgml.rb @@ -18,28 +18,38 @@ def helpers end end - def render(*args, **, &block) + def render(*args, **kwargs, &block) renderable = args[0] case renderable - when Phlex::SGML, Proc, Method + when Phlex::SGML, Proc, Method, String return super when Class return super if renderable < Phlex::SGML when Enumerable return super unless ActiveRecord::Relation === renderable - else - if block - @_context.target << @_view_context.render(*args, **) 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 + when nil + partial = kwargs.delete(:partial) + + if partial # this is a hack to get around https://github.com/rails/rails/issues/51015 + @_context.target << @_view_context.render(partial, **kwargs) do |*yielded_args| + capture(*yielded_args, &block) + end + + return nil + end + end + + if 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 - else - @_context.target << @_view_context.render(*args, **) end + else + @_context.target << @_view_context.render(*args, **kwargs) end nil @@ -81,28 +91,6 @@ def capture(...) super&.html_safe end - # @api private - def __text__(content) - case content - when ActiveSupport::SafeBuffer - @_context.target << content - else - super - end - end - - # TODO: Re-introduce this when we can figure out how to test it - # def await(task) - # case task - # when ActiveRecord::Relation - # future = task.instance_variable_get(:@future_result) - # flush if future && future.pending? - # task - # else - # super - # end - # end - # Trick ViewComponent into thinking we're a ViewComponent to fix rendering output # @api private def set_original_view_context(view_context) diff --git a/test/dummy/app/views/rendering/partial_from_phlex.rb b/test/dummy/app/views/rendering/partial_from_phlex.rb index 2083335..c3dff24 100644 --- a/test/dummy/app/views/rendering/partial_from_phlex.rb +++ b/test/dummy/app/views/rendering/partial_from_phlex.rb @@ -3,7 +3,7 @@ module Rendering class PartialFromPhlex < ApplicationView def view_template - render "partial" do + render partial: "partial" do h1(id: "phlex") { "Partial from Phlex" } end end