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