Super simple serving of ruby pages


#1

Hi. I apologize in advance if this is a dumb question, but though I’ve
searched online I haven’t found an answer.

I’m starting to teach my 8yr daughter Ruby. We’ve covered HTML and CSS
already and she handcoded her own static website. I’d like to
incorporate her Ruby learning experience into her website, which is
much more interesting for her than using Ruby to write scripts or
desktop apps. She’s just starting out, so Rails is much too complicated
for her. She’s not ready for the whole MVC concept yet. What I’d like
to do is to run very simple Ruby scripts from the site and incorporate
Ruby code into rhtml files, but without Rails. I don’t really want a
“framework”, just the ability to run a ruby file that will serve up an
rhtml file. In other words, something very simple like PHP (I don’t
want to teach her PHP). [I’ll get into Rails later once she’s more advanced.]

ERb looks like the ticket, but there’s a missing link (for me). I can
write a ruby script that generates an rhtml file, but then how do I
serve that rhtml file without a framework like
Rails/Nitro/Camping/etc.? Probably the answer is with Webrick somehow,
but I’m missing the connection. I can’t find a simple tutorial anywhere
online, and I’m no expert on web applications.

Thanks for the help.


#2

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

Ruby code into rhtml files, but without Rails. I don’t really want a
online, and I’m no expert on web applications.

Thanks for the help.

Webrick has WEBrick::HTTPServlet::ERBHandler, which (I believe) serves
ERb pages. Mongrel probably has something similar.


#3

zerohalo wrote:

/ …

ERb looks like the ticket, but there’s a missing link (for me). I can
write a ruby script that generates an rhtml file, but then how do I
serve that rhtml file without a framework like
Rails/Nitro/Camping/etc.? Probably the answer is with Webrick somehow,
but I’m missing the connection. I can’t find a simple tutorial anywhere
online, and I’m no expert on web applications.

Just one question. Do you want the existing Web server to serve your
Ruby
code, or do you require the server to be Ruby-based also?

If the former, you can tell Apache to serve Ruby scripts that contain
the
usual CGI conventions. That seems simple enough. And it might not be
what
you are asking for.


#4

Paul L. wrote:

Just one question. Do you want the existing Web server to serve your Ruby
code, or do you require the server to be Ruby-based also?

No, the server doesn’t need to be Ruby-based. I could use lighttpd or
apache to serve the code.

If the former, you can tell Apache to serve Ruby scripts that contain the
usual CGI conventions. That seems simple enough. And it might not be what
you are asking for.

That’s the part I’m missing. I find Apache extremely difficult to
configure (beyond the basics). How would I tell Apache to serve Ruby
scripts?

Thanks.


#5

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

Ruby code into rhtml files, but without Rails. I don’t really want a
online, and I’m no expert on web applications.

Thanks for the help.

Webrick seems to have support for ERB - see httpservlet/erbhandler.rb,
that is used for .rhtml files by FileHandler. Just find in the
tutorials how to start webrick for a given document root
(Webrick::HttpServer.new({:DocumentRoot = ‘/var/www/’}) and
something?)

You can use meta_vars and query variables in your rhtml files.


#6

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

usual CGI conventions. That seems simple enough. And it might not be what
you are asking for.

That’s the part I’m missing. I find Apache extremely difficult to
configure (beyond the basics). How would I tell Apache to serve Ruby
scripts?

In a recent thread (eruby?) someone mentioned adding

AddType application/x-httpd-eruby .rhtml
Action application/x-httpd-eruby /cgi-bin/eruby
to httpd.conf

In my win installation there is c:/ruby/bin/erb.bat so I suppose there
is something similar in unix. Now either add #!/usr/bin/erb to the top
of any .cgi file or, preferably, do something similar to the above,
somehow telling apache to run erb.

(I’m not an apache guru, so these are just hints to get you started…)


#7

Jan S. wrote:

Webrick seems to have support for ERB - see httpservlet/erbhandler.rb,
that is used for .rhtml files by FileHandler. Just find in the
tutorials how to start webrick for a given document root
(Webrick::HttpServer.new({:DocumentRoot = ‘/var/www/’}) and
something?)

Yes, I tried that. Unfortunately there is no documentation on the
webrick site on how to use ERBHandler. I have this in a ruby script
which does start up the Webrick server. However, while it serves HTML
files fine, it treats RHTML files as binaries and RB files as just
plain text. Here’s my code:


require 'webrick'
include WEBrick

def start_webrick(config = {})
  config.update(:Port => 8080)
  server = HTTPServer.new(config)
  yield server if block_given?
  ['INT', 'TERM'].each {|signal|
    trap(signal) {server.shutdown}
  }
  ruby_dir = File.expand_path('/data/sandbox/ruby')
  server.mount("/data/sandbox/ruby", HTTPServlet::ERBHandler, ruby_dir)
  server.start
end

start_webrick(:DocumentRoot => '/data/sandbox/ruby')

#8

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

Yes, I tried that. Unfortunately there is no documentation on the
webrick site on how to use ERBHandler. I have this in a ruby script
which does start up the Webrick server. However, while it serves HTML
files fine, it treats RHTML files as binaries and RB files as just
plain text. Here’s my code:

require ‘webrick’
include WEBrick

def start_webrick(config = {})
config.update(:Port => 8080)

  • config.update(:MimeTypes => {‘rhtml’ => ‘text/html’})
    server = HTTPServer.new(config)
    yield server if block_given?
    [‘INT’, ‘TERM’].each {|signal|
    trap(signal) {server.shutdown}
    }
  • ruby_dir = File.expand_path(’/data/sandbox/ruby’)
  • server.mount("/data/sandbox/ruby", HTTPServlet::ERBHandler, ruby_dir)
    server.start
    end

start_webrick(:DocumentRoot => ‘/data/sandbox/ruby’)


#9

Thanks, Jan. That was easy. Now .rhtml files render correctly.

Is there a way to tell it to execute .rb files rather than treat them
as simple text files?


#10

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

[snip]

If the former, you can tell Apache to serve Ruby scripts that contain the
usual CGI conventions. That seems simple enough. And it might not be what
you are asking for.

That’s the part I’m missing. I find Apache extremely difficult to
configure (beyond the basics). How would I tell Apache to serve Ruby
scripts?

On Debian and Ubuntu, it just works. After you apt-get install
apache2, you just copy some foo.rb file (maybe like the one shown
below) to /usr/lib/cgi-bin/ and then point your browser at
http://localhost/cgi-bin/foo.rb and boom. :slight_smile:

==== snip /usr/lib/cgi-bin/foo.rb ====
#!/opt/ruby/bin/ruby -w

puts “Content-type: text/html”
puts

puts "

The time is now #{Time.now}, so you'd better get crackin'!

" ==== /snip ====

—John


#11

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

files fine, it treats RHTML files as binaries and RB files as just
plain text. Here’s my code:

require ‘webrick’
include WEBrick

  • module WEBrick
  • module HTTPServlet
  • FileHandler.add_handler("rb", CGIHandler)
    
  • end
  • end
  • server.mount("/data/sandbox/ruby", HTTPServlet::ERBHandler, ruby_dir)
    server.start
    end

start_webrick(:DocumentRoot => ‘/data/sandbox/ruby’)

Now it starts .rb for me, although I’m not able to write any good cgi
right now :wink: maybe it’s because I’m on windows…


#12

Jan S. wrote:

Now it starts .rb for me, although I’m not able to write any good cgi
right now :wink: maybe it’s because I’m on windows…

Doesn’t work for me. With even the simplest .rb file it gives me the
following error:

ERROR Premature end of script headers:

but maybe I need to put a particular include in particular at the top
of each .rb file? Not used to working with .rb files outside Rails.


#13

On 9/20/06, zerohalo removed_email_address@domain.invalid wrote:

I don’t really want a
“framework”, just the ability to run a ruby file that will serve up an
rhtml file. In other words, something very simple like PHP (I don’t
want to teach her PHP). [I’ll get into Rails later once she’s more advanced.]

Does this help?
http://cyll.org/blog/tech/2006-08-26-makingrubyintophp.html


#14

Wilson B. wrote:

Does this help?
http://cyll.org/blog/tech/2006-08-26-makingrubyintophp.html

Indeed it did. Thanks. That works nicely.


#15

zerohalo wrote:

Jan S. wrote:

Now it starts .rb for me, although I’m not able to write any good cgi
right now :wink: maybe it’s because I’m on windows…

Doesn’t work for me. With even the simplest .rb file it gives me the
following error:

ERROR Premature end of script headers:

This is a classic CGI header error, caused by the absence of a
recognizable
emitted header like:

print “Content-type: text/html\r\n\r\n”

As the first text emitted by the script.

Remember, if you can get the server to read the filetype and treat it as
a
well-behaved source, and if you can get the Ruby scripts to emit the
expected header information, your server requirements become much
simpler
to meet.


#16

Paul L. wrote:

This is a classic CGI header error, caused by the absence of a recognizable
emitted header like:

print “Content-type: text/html\r\n\r\n”

As the first text emitted by the script.

Got it. That works, thanks, Paul, and Jan, for your patience with my
ignorance.


#17

zerohalo wrote:

usual CGI conventions. That seems simple enough. And it might not be what
you are asking for.

That’s the part I’m missing. I find Apache extremely difficult to
configure (beyond the basics). How would I tell Apache to serve Ruby
scripts?

Others have offered good advice. The simplest way is to give the server
what
it expects to see:


#!/usr/bin/ruby -w

print “Content-type: text/html\r\n\r\n”

print “

Hello world!


Put this file in a directory where executable content is expected to be,
like /serverpath/cgi-bin, and chances are Apache will treat it as you
would
expect, without any special configuration.


#18

zerohalo wrote:

Hi.

Hi.

She’s just starting out, so Rails is much too complicated
for her. She’s not ready for the whole MVC concept yet.

FWIW, I have the brain of an 8yr old in when it comes
to web-aps, and I managed to write a /couple/ Camping aps
the other evening.

Regards,


#19

François Montel wrote:

Got it. That works, thanks, Paul, and Jan, for your patience with my
ignorance.

It seems like I am at the same level as your daughter [although a whole
9 years older] and am trying to do the same thing you are. I could not
get anything working from what I gathered in this thread, but it seems
you have. Can you tell me what you ended up doing so I can do that too?

thanks


#20

Jonathan D. wrote:

François Montel wrote:

Got it. That works, thanks, Paul, and Jan, for your patience with my
ignorance.

It seems like I am at the same level as your daughter [although a whole
9 years older] and am trying to do the same thing you are. I could not
get anything working from what I gathered in this thread, but it seems
you have. Can you tell me what you ended up doing so I can do that too?

It’s very simple, really. Apache requires that executable pages (pages
that
have to be processed by an interpreter like Ruby) by placed in a special
directory. The default for this is usually /sitedirectry/cgi-bin.

Write an ordinary Ruby script, but make sure the first thing it prints
is a
CGI header, like this:

print “Content-type: text/html\r\n\r\n”

After this first line, just output HTML, as in my prior example, and the
page will appear to all intents and purposes as though it contains the
text
it is printing. Therefore your Ruby code decides what the page content
is,
and it is obviously dynamic.

A Ruby interpreter must be installed on the server machine. Apart from
that,
it should work without any fuss.