diff --git a/lib/phlex/rails/helper_macros.rb b/lib/phlex/rails/helper_macros.rb index 45617e65..5519719a 100644 --- a/lib/phlex/rails/helper_macros.rb +++ b/lib/phlex/rails/helper_macros.rb @@ -7,8 +7,6 @@ def register_output_helper(method_name) # frozen_string_literal: true def #{method_name}(*args, **kwargs, &block) - context = @_context - return if context.fragments && !context.in_target_fragment output = if block helpers.#{method_name}(*args, **kwargs) { capture(&block) } @@ -16,11 +14,17 @@ def #{method_name}(*args, **kwargs, &block) helpers.#{method_name}(*args, **kwargs) end - case output - when ActiveSupport::SafeBuffer - @_context.target << output + return unless ActiveSupport::SafeBuffer === output + + context = @_context + + fragments = context.fragments + if fragments && !context.in_target_fragment + output = Phlex::Rails::FragmentFinder.extract(output, fragments) end + context.target << output + nil end RUBY @@ -47,8 +51,6 @@ def register_builder_yielding_helper(method_name, builder) # frozen_string_literal: true def #{method_name}(*args, **kwargs) - context = @_context - return if context.fragments && !context.in_target_fragment output = if block_given? helpers.#{method_name}(*args, **kwargs) { |form| capture do @@ -63,11 +65,17 @@ def #{method_name}(*args, **kwargs) helpers.#{method_name}(*args, **kwargs) end - case output - when ActiveSupport::SafeBuffer - @_context.target << output + return unless ActiveSupport::SafeBuffer === output + + context = @_context + + fragments = context.fragments + if fragments && !context.in_target_fragment + output = Phlex::Rails::FragmentFinder.extract(output, fragments) end + context.target << output + nil end RUBY diff --git a/lib/phlex/rails/helpers/link_to.rb b/lib/phlex/rails/helpers/link_to.rb index 274ec4f5..48f5ca32 100644 --- a/lib/phlex/rails/helpers/link_to.rb +++ b/lib/phlex/rails/helpers/link_to.rb @@ -3,7 +3,21 @@ module Phlex::Rails::Helpers::LinkTo extend Phlex::Rails::HelperMacros - # @!method link_to(...) - # @return [nil] - register_output_helper :link_to + def link_to(*args, **kwargs, &block) + context = @_context + + if context.fragments && !context.in_target_fragment && !context.fragments[kwargs[:id]] + return nil + end + + output = if block + helpers.link_to(*args, **kwargs) { capture(&block) } + else + helpers.link_to(*args, **kwargs) + end + + return unless ActiveSupport::SafeBuffer === output + + context.target << output + end end diff --git a/lib/phlex/rails/sgml.rb b/lib/phlex/rails/sgml.rb index fdabfb64..a55a8dee 100644 --- a/lib/phlex/rails/sgml.rb +++ b/lib/phlex/rails/sgml.rb @@ -30,7 +30,16 @@ def render(*args, **kwargs, &block) return super unless renderable.is_a?(ActiveRecord::Relation) else captured_block = -> { capture(&block) } if block - @_context.target << @_view_context.render(*args, **kwargs, &captured_block) + output = @_view_context.render(*args, **kwargs, &captured_block) + + context = @_context + fragments = context.fragments + + if fragments && !context.in_target_fragment + output = Phlex::Rails::FragmentFinder.extract(output, fragments) + end + + context.target << output end nil diff --git a/spec/fragment_filter_spec.rb b/spec/fragment_finder_spec.rb similarity index 82% rename from spec/fragment_filter_spec.rb rename to spec/fragment_finder_spec.rb index 7505ca01..5c899525 100644 --- a/spec/fragment_filter_spec.rb +++ b/spec/fragment_finder_spec.rb @@ -2,6 +2,16 @@ describe Phlex::Rails::FragmentFinder do include Phlex::Rails::FragmentFinder + it "find nothing" do + expect( + extract(<<~HTML, ["d"]) +