Skip to content

Instantly share code, notes, and snippets.

@thinkerbot
Created September 18, 2009 19:22
Show Gist options
  • Save thinkerbot/189234 to your computer and use it in GitHub Desktop.
Save thinkerbot/189234 to your computer and use it in GitHub Desktop.
A basic RESTful Sinatra application
require 'rubygems'
require 'erb'
require 'sinatra/base'
# A basic RESTful Sinatra app for serving some kind of object. Uses views:
#
# views
# |- error.erb
# |- index.erb
# |- layout.erb
# |- show.erb
# `- unknown.erb
#
class App < Sinatra::Base
set :root, File.expand_path(File.dirname(__FILE__) + "/..")
set :raise_errors, false
set :dump_errors, true
template(:layout) do
File.read("views/layout.erb")
end
error RuntimeError do
erb :error, :locals => {:err => env['sinatra.error']}
end
get('/') { index}
get('/:id') {|id| show(id) }
post('/') { create(request[:id]) }
post '/:id' do |id|
_method = request[:_method]
case _method
when /\Aupdate\z/i then update(id)
when /\Adelete\z/i then destroy(id)
when nil then create(id)
else error("unknown post method: #{_method}")
end
end
put('/:id') {|id| update(id) }
delete('/:id') {|id| destroy(id) }
attr_accessor :objects
def initialize(app=nil)
super(app)
@objects = {}
end
# GET /
def index
erb :index, :locals => {:objects => objects}
end
# GET /id
def show(id)
if object = objects[id]
erb :show, :locals => {:id => id, :object => object}
else
erb :unknown, :locals => {:id => id}
end
end
# POST /id
def create(id)
return raise("no id specified") if id.nil?
if objects.has_key?(id)
raise("already exists: #{id}")
else
objects[id] = Object.new
redirect "/#{id}"
end
end
# PUT /id
# POST /id?_method=put
def update(id)
objects[id].call(request.env)
redirect "/#{id}"
end
# DELETE /id
# POST /id?_method=delete
def destroy(id)
objects.delete(id)
redirect "/"
end
end
App.run! :host => 'localhost', :port => 8080
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment