Output buffering


#1

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


#2

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


#3

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


#4

Mark,

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

thanks,
eduard


#5

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


#6

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


#7

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

}


#8

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