diff --git a/CHANGES b/CHANGES index 93ab9ff2..e150a772 100644 --- a/CHANGES +++ b/CHANGES @@ -18,6 +18,8 @@ * Fix :provides causing crash on any request when request has no Accept header [#139] * Fix that ERB templates were evaluated twice per "erb" call. + * The ERB output buffer is now available to helpers via the @_out_buf + instance variable. = 0.9.0.4 / 2009-01-25 diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 37fab962..54a000f4 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -281,12 +281,17 @@ module Sinatra end def render_erb(template, data, options, &block) + original_out_buf = @_out_buf data = data.call if data.kind_of? Proc + instance = ::ERB.new(data, nil, nil, '@_out_buf') locals = options[:locals] || {} locals_assigns = locals.to_a.collect { |k,v| "#{k} = locals[:#{k}]" } + src = "#{locals_assigns.join("\n")}\n#{instance.src}" eval src, binding, '(__ERB__)', locals_assigns.length + 1 + @_out_buf, result = original_out_buf, @_out_buf + result end def render_haml(template, data, options, &block) diff --git a/test/erb_test.rb b/test/erb_test.rb index df3902d2..95b5f2e0 100644 --- a/test/erb_test.rb +++ b/test/erb_test.rb @@ -64,4 +64,18 @@ describe "ERB Templates" do assert ok? assert_equal 'THIS. IS. SPARTA!', body end + + it "can be used in a nested fashion for partials and whatnot" do + mock_app { + template(:inner) { "<%= 'hi' %>" } + template(:outer) { "<%= erb :inner %>" } + get '/' do + erb :outer + end + } + + get '/' + assert ok? + assert_equal 'hi', body + end end