Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Very basic rack application showing how to use a router based on the uri and how to process requests based on the HTTP method used.
#########################################
# Very basic rack application showing how to use a router based on the uri
# and how to process requests based on the HTTP method used.
#
# Usage:
# $ rackup rack_example.ru
#
# $ curl -X POST -d 'title=retire&body=I should retire in a nice island' localhost:9292/ideas
# $ curl -X POST -d 'title=ask Satish for a gift&body=Find a way to get Satish to send me a gift' localhost:9292/ideas
# $ curl localhost:9292/ideas
#
# More info: https://github.com/rack/rack/wiki/Rack-app-with-uri-and-HTTP-specific-responses
#########################################
class Idea
attr_accessor :title, :body, :created_at
# Memory store, gets cleared as the process is restarted
def self.store
@ideas ||= []
end
class InvalidParams < StandardError; end
# create an instance based on some passed params
def initialize(params)
raise InvalidParams, "You need to provide at least a title" unless params['title']
self.title = params['title']
self.body = params['body']
self.created_at = Time.now
end
# Converts an instance into a string
def to_s
"#{title} at #{created_at.to_s}\n#{body}"
end
end
class IdeaAPI
def call(env)
request = Rack::Request.new(env)
case request.request_method
when 'POST'
begin
idea = Idea.new(request.params)
rescue Idea::InvalidParams => error
[400, {"Content-Type" => "text/plain"}, [error.message] ]
else
Idea.store << idea
[200, {"Content-Type" => "text/plain"}, ["Idea added, currently #{Idea.store.size} ideas are in memory!"]]
end
when 'GET'
[200, {"Content-Type" => "text/plain"}, [Idea.store.map{|idea, idx| idea.to_s }.join("\n\n") + "\n"]]
else
[404, {}, ["Did you get lost?"]]
end
end
end
map '/ideas' do
run IdeaAPI.new
end
@cameronroe

Great example! Thanks Matt!

@theFreedomBanana

Got me a rack better understanding. Thx

@jjgh
jjgh commented Oct 7, 2015

Could anyone help me with http://stackoverflow.com/questions/32998295/for-a-rack-app-how-do-i-make-passenger-standalone-serve-the-output-of-erb-file I've been searching a lot but I don't know where else to look for, sorry!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.