Kontrol - a micro framework
Kontrol is a small web framework written in Ruby, which runs directly on Rack. Basically you can mount a class as rack handler and attach a set of named routes, which will be used for route recognition and generation.
All examples can be found in the examples folder of the kontrol project, which is hosted on github.
Quick Start
We will create a simple Kontrol application with exactly one route named 'root'. Routes are defined within a block insider your application class. Each route has a name, a pattern and a block. The name must be defined to generate paths pointing to this route.
hello_world.ru
:
class HelloWorld < Kontrol::Application
def time
Time.now.strftime "%H:%M:%S"
end
map do
root '/' do
text "<h1>Hello World at #{time}</h1>"
end
end
end
run HelloWorld.new
Now run:
rackup hello_world.ru
Browse to http://localhost:9292
and you will see "Hello World".
Basics
A Kontrol application is a class, which provides some context to the defined actions. You will probably use these methods:
- request: the Rack request object
- response: the Rack response object
- params: union of GET and POST parameters
- cookies: shortcut to request.cookies
- session: shortcut to
request.env['rack.session']
- redirect(path): renders a redirect response to specified path
- render(file, variables): render a template with specified variables
- text(string): render a string
Routing
Routing is just as simple as using regular expressions with groups. Each group will be provided as argument to the block.
Create a file named routing.ru
:
require 'kontrol'
class Routing < Kontrol::Application
map do
pages '/pages/(.*)' do |name|
text "The path is #{ pages_path name }! "
end
archive '/(\d*)/(\d*)' do |year, month|
text "The path is #{ archive_path year, month }! "
end
end
end
run Routing.new
Now run this application:
rackup routing.ru
You will now see, how regex groups and parameters are related. For
example if you browse to localhost:9292/2008/12
, the app will
display The path is /2008/12
.
The inverse operation to route recognition is route generation. That means a route with one or more groups can generate a url, which will be recognized this very route.
For example the route /page/(.*)
named page will recognize the path
/page/about
, which can be generated by using page_path('about')
.
Templates
Rendering templates is as simple as calling a template file with some parameters, which are accessible inside the template as instance variables. Additionally you will need a layout template.
Create a template named templates/layout.rhtml
:
<html>
<body>
<%= @content %>
</body>
</html>
And now another template named templates/page.rhtml
:
<h1><%= @title %></h1>
<%= @body %>
Create a templates.ru file:
require 'kontrol'
class Templates < Kontrol::Application
map do
page '/(.*)' do |name|
render "page.rhtml", :title => name.capitalize, :body => "This is the body!"
end
end
end
run Templates.new
Now run this example:
rackup templates.ru
If you browse to any path on localhost:9292
, you will see the
rendered template. Note that the title and body parameters have been
passed to the render
call.
Using GitStore
GitStore is another library, which allows you to store code and data in a convenient way in a git repository. The repository is checked out into memory and any data may be saved back into the repository.
Install [GitStore][] by:
$ gem sources -a http://gems.github.com
$ sudo gem install georgi-git_store
We create a Markdown file name index.md
:
Hello World
===========
This is the **Index** page!
We have now a simple page, which should be rendered as response. We
create a simple app in a file git_app.ru
:
require 'kontrol'
require 'bluecloth'
require 'git_store'
class GitApp < Kontrol::Application
def initialize(path)
super
@store = GitStore.new(path)
end
map do
page '/(.*)' do |name|
text BlueCloth.new(@store[name + '.md']).to_html
end
end
end
run GitApp.new
Add all the page to your git repository:
git init
git add index.md
git commit -m 'init'
Run the app:
rackup git_app.ru
Browse to http://localhost:9292/index
and you will see the rendered
page generated from the markdown file.
This application runs straight from the git repository. You can even delete the page and it will still show up over the web.