Yes.
One of my clients, a mutual fund, has their entire site powered by Ruby.
The basic need there was that the way the site was designed, they have two
different versions of content occupying the same URL space. One version
is public, and the other is private for brokers, distributors, and other
financial professionals. So, the Ruby underneath takes care of delivering
the right content for a given request, depending on whether the requestor
is logged in to the private version or not. At the same time, the code
also takes care of all of the various dynamic content pieces. I can't
give a URL to this site because of a confidentiality agreement.
I am redoing my company website, though, and it also has Ruby sitting
behind all of it. In this case, the framework takes care of handling the
navigation menu, header and footer inclusions, a client login section
where customers can view and pay invoices online, some simple dynamic
content demos, a client facing system status display where customers can
see a live and current display of the operational status of their systems,
and delivery of a correct stylesheet based on the type of browser making a
request. I'd rather have two slightly different stylesheets than have one
stylesheet with gross hacks in it to deal with differences in browser
implementations of CSS (thought te CSS that I have now still has a slight
issue with Opera).
Not all of these bits are online, yet, but feel free to take a look at
what is done:
http://enigo.com
It's all done under Iowa. The stuff that is just plain HTML is just plain
HTML files, but where there is something dynamic going on, there is a code
file associated with the HTML that contains the Ruby that handles the
dynamic bits.
The site redesign for my Iowa tutorial and documentation(the new versions
of which are not ready to be public yet), is done in much the same way.
The way that this all works is that there is a mod_ruby handler that is
setup to take a first crack at requests:
RubyRequire '/apache/mod_iowa'
<Location />
RubySetEnv IOWA_SOCKET "localhost:12345"
RubySetEnv MAP_FILE "/usr/local/htdocs/enigo.com/mapfile.cnf"
SetHandler ruby-object
RubyHandler Apache::Iowa
RubyTransHandler Apache::Iowa
</Location>
High level nutshell -- when Apache geta a request that matched the
location specified, it passes it to the handler. If the request is for a
URL specified in the mapfile.cnf file, then the handler issues a request
to the socket specified in the IOWA_SOCKET variable. This request is
basically a Marshalled clone of Apache::Request, giving the Iowa app full
access to the HTTP headers, query_string parameters, etc... This
Iowa::Request can be thought of as a Marshalable 80% close of
Apache::Request. It also works outside of mod_ruby, populating the
Iowa::Request with data pulled from the standard CGI environment
variables. Anyway, the request is passed off to Iowa. Iowa, running in
this way, will lookup the URL requested in a mapfile on its end, so that
it knows which class to use to handle the request.
Unless specifically specified in the associated code file, the class for a
plain HTML file is derived from the filename.
So, for examples:
Index.html becomes Iowa::Application::ContentClasses::Index
Gerbils/FAQ.html becomes Iowa::Application::ContentClasses::Gerbils::FAQ
and so on. This leads into one of the few current required naming
conventions. A filename has to follow Ruby rules for a valid class name
(the part before the .html, that is).
It all works very well. I can put a site with dynamic content together
quickly because I can leverage Ruby, and I can still use plain old HTML
for all of the areas where I want that. I have zero problems with it.
The Iowa process doesn't have a very large resident set size, even for
sites that have a lot of content and require a larger session cache than
the default 10. It's relatively fast. Speed is dependent on the size of
the content being returned and on just how much processing is required to
generate the dynamic stuff. On Ruby 1.8.1, on an 800Mhz test box, I
get around 35-40ish pages per second for relatively simple pages like the
Enigo navigation & homepage. On 1.6.8 it is somewhat slower, and seems to
evoke a threading bug if hammered for lots of hits per second, causing a
segfault.
So, I suppose my whole point here is that Ruby/mod_ruby can definitely be
used to power an entire web site. No problem. The issues all really come
up depending on whether you are using some framework like the recently
posted about 0.2 release of SWS or Iowa or something else or whether you
are using eruby or.... Each of these is going to have different strenghts
and weaknesses.
Kirk Haines
···
On Fri, 5 Mar 2004, Ruby Baby wrote:
I run a website that's all PHP now, but was due for
a total re-write anyway. (The old code is a mess.)
It's more MVC style - where the code comes first and
outputs HTML from templates - NOT embedded code inside HTML.
I love Ruby so much that it's very tempting to write
my new version in Ruby (mod_ruby + Apache).
But I wonder if anyone who has already done a whole
interactive website in Ruby/modruby could share their
experience with it?