Exercise 4


Ruby web apps with Sinatra

 

Sinatra is a DSL (domain specific language) for creating web applications.  This sounds complicated, but what it boils down to is that Sinatra has methods that read almost like English that make it easy to create a web app.

Installation

Installing Sinatra is easy.  At the command line, run:

gem install sinatra

Sample Web Application

For instance, create a Ruby script named webapp.rb with the following contents

require 'sinatra'

get '/' do
  "Hello world!"
end

Save the file and at the command line, run:

ruby webapp.rb

If all went well, you should see output similar to:

== Sinatra/1.2.6 has taken the stage on 4567 for development with backup from WEBrick
[2011-05-26 07:29:49] INFO  WEBrick 1.3.1
[2011-05-26 07:29:49] INFO  ruby 1.9.2 (2011-02-18) [x86_64-linux]
[2011-05-26 07:29:49] INFO  WEBrick::HTTPServer#start: pid=2644 port=4567

Take note of the "port=XXXX" portion.  In this case, since it reads 4567, the web application is available at http://localhost:4567/  Using a browser, navigate to that URL.  You should see "Hello World!"

Further Reading

A full introduction to Sinatra is available at the Sinatra website.  I encourage you to read over that document, even if some of it does not make sense because it assumes some knowledge of web development.  Do focus on the parts you can understand at this point.  The exercise below will only require a basic knowledge.

Exercise

Create a simple web application that manages a TODO list.  The web application should respond to the following routes:

http://localhost:4567/                    - display the TODO list
http://localhost:4567/add/wash+the+dog    - adds "wash the dog" as a TODO list item (notice spaces need to be escaped as plus signs in URLs)
http://localhost:4567/remove/wash+the+dog - removes "wash the dog" as a TODO list item

Since this may be a bit overwhelming, I've given you a skeleton program below and some hints.  Copy this program into your git repository, finish it up, and commit it.

require 'sinatra'

# Remember arrays?  We'll store the TODO list in an array
items = []

get '/' do
  # To iterate through an array, use the #each method (look back at LtP Chapter 7)
  # Note that "puts" in Sinatra will only output to the console, not the web
  # browser.  Instead, build up a string called "response" and return it to
  # Sinatra so that will be the response

  response = ""
  items.each do |item|
    # TODO: Build up the response string by concatenating "item" and a line
    # break "<br/>" to the string
  end

  # Keep the line here so that response is returned to sinatra
  response
end

get '/add/:item' do
  # The new item will be available as params[:item]
  # TODO: Insert code to add params[:item] to the global items array here

  redirect to('/')
end

get '/remove/:item' do
  # The item to be removed will be available as params[:item]
  # TODO: Insert code to remove params[:item] from the global items array
  # here.  You may want to use a method called Array#delete (look it up in the
  # documentation!)

  redirect to('/')
end