diff --git a/lib/block_helpers.rb b/lib/block_helpers.rb index aba1c97..86d4841 100644 --- a/lib/block_helpers.rb +++ b/lib/block_helpers.rb @@ -17,11 +17,16 @@ def self.inherited(klass) klass.parent.class_eval %( def #{method_name}(*args, &block) renderer = #{klass.name}.new(*args) - renderer.send(:helper=, self) + top_level_helper = if self.is_a?(BlockHelpers::Base) + self.helper + else + self + end + renderer.send(:helper=, top_level_helper) body = block ? capture(renderer, &block) : nil processed_body = renderer.display(body) if processed_body - if method(:concat).arity == 2 + if top_level_helper.method(:concat).arity == 2 concat processed_body, binding else concat processed_body diff --git a/spec/helpers/block_helpers_spec.rb b/spec/helpers/block_helpers_spec.rb index 21b9471..28034bc 100644 --- a/spec/helpers/block_helpers_spec.rb +++ b/spec/helpers/block_helpers_spec.rb @@ -281,4 +281,37 @@ def display(body) end end + describe "nested block helpers" do + it "should define a nested block helper method" do + module TestHelperModule + class OuterHelper < BlockHelpers::Base + + def egg + 'bad egg' + end + + def display(body) + "Outer #{body}" + end + + class InnerHelper < BlockHelpers::Base + def egg + 'EGG' + end + def display(body) + "Inner #{body}" + end + end + end + end + eval_erb(%( + <% outer_helper do |o| %> + <% o.inner_helper do |i| %> + <%= i.egg %> + <% end %> + <% end %> + )).should match_html("Outer Inner EGG") + end + end + end