Output buffering

Hi,
Is there any way to do php-style output buffering with ruby or rails?
as in:

ob_start()
%>
html goes in here
<%
html=ob_get_contents()
ob_end_clean()
puts html

hi

mark wrote:

Is there any way to do php-style output buffering with ruby or rails?
as in:
ob_start()

In ruby, generally, you’d achieve the same thing by redirecting $stdout.
Something like:

require ‘stringio’
tmp_out = StringIO.new()

redirect STDOUT

$stdout = tmp_out

puts “this and that” # would normally go to STDOUT

restore default stdout

$stdout = STDOUT

tmp_out.rewind()
puts tmp_out.read() # print out what was sent to STDOUT

I don’t know whether Ruby on Rails has any special facility for
temporarily
redirecting output of literal HTML snippets within a mixed Ruby-HTML
template (as the PHP function does, iirc). The rails mailing list should
be able to help you with that one.

cheers
alex

Thanks for the reply Alex but this doesn’t seem to work, maybe it’s a
mod_ruby thing but nothing after
$stdout = tmp_out
gets sent no matter what I do with $stdout

Mark,

I am having a similar problem. Have you ever figured out how to do
ob_start() in Ruby?

thanks,
eduard

mark wrote:

Thanks for the reply Alex but this doesn’t seem to work, maybe it’s a
mod_ruby thing but nothing after
$stdout = tmp_out
gets sent no matter what I do with $stdout

I think mod_ruby overloads some of ruby’s standard IO mechanisms, eg the
Kernel#puts method. You probably need to restore ‘standard’ STDOUT in a
slightly different way in mod_ruby. There’s a mod_ruby mailing list
where you might get a quicker answer, or try googling STDOUT + mod_ruby
etc

cheers
alex

eduard wrote:

Mark,

I am having a similar problem. Have you ever figured out how to do
ob_start() in Ruby?

I am not familiar with PHP, would you be able to give an
example where this would be useful or what this is commonly
used for? This might enable finding a ruby equivalent.

thanks,
eduard

E

I was just trying to find an easy way set headers for each page.

Tom F. suggested this and it works great.

after_filter { |controller|

    controller.response.headers['Content-Length'] =

controller.response.body.length

}

This is an old thread but it helped me. See my write-up here:
http://pmacek.blogspot.com/2010/09/output-buffering-with-ruby.html