It’s possible to construct a web application using the Camping microframework without using the *::Views
module. Most of the time, you would be crazy to do so, since the *::Views
module makes it very easy to print out HTML responses using _why’s Markaby markup engine.
There is a strong use case for not using *::Views
– if you want to return data that is not supposed to be formatted as HTML (like XML or JSON), you’ll probably find that it’s more work than it really ought to be, to print out that response.
That’s right. I’m going to show you a camping app that does not use either the *::Views
or the *::Models
modules, that is perfectly legit:
#!/usr/bin/env ruby
require 'rubygems'
require 'camping'
Camping.goes :HelloWorld
module HelloWorld::Controllers
class Index < R '/'
def get
%Q(
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>My small page</title></head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
)
end
end
end
If you save this program as hello_world.rb
, then run camping hello_world.rb
, it will run fine, and if you point your browser to http://localhost:3301/
, you will see the friendly greeting.
What’s going on? Let’s rewrite the application to something more familiar:
#!/usr/bin/env ruby
require 'rubygems'
require 'camping'
Camping.goes :HelloWorld
module HelloWorld::Controllers
class Index < R '/'
def get
render :hello_world
end
end
end
module HelloWorld::Views
def hello_world
html do
head do
title "My small page"
end
body do
h1 "Hello, world!"
end
end
end
end
If you run this hello_world.rb
app, you’ll get almost the same output. There is almost no magic involved here; in the get
function, we have a render
statement that performs the necessary work to call the hello_world
function in the HelloWorld::Views
module. What’s not obvious here (except to seasoned Rubyists, I suppose) is that there is an implicit return in the hello_world
function; it returns a string containing the HTML to be printed. There is also an implicit return happening in the controller, where the results of the render
statement (the Hello, world page) is returned to its caller.
So the dirty secret is out: as long as the methods in your controller classes return a string, whatever is in that string is what’s going to be returned to the browser.
Most of the time, you want to use the *::Views
module, because, most of the time, you want to return HTML to the browser.
Knowing what we know now, we have the ability to do a couple of useful and interesting things:
render_component
feature into your Camping appI’m going to get into more of this in future articles.
Copyright © 2009
Robert Hahn.
All Rights Reserved unless otherwise indicated.