Building Web Apps with Rack and Sinatra

01936081830eb609b634e8b14a2a654e?s=47 Tom Black
October 16, 2012

Building Web Apps with Rack and Sinatra

Project files and notes at www.blacktm.com

01936081830eb609b634e8b14a2a654e?s=128

Tom Black

October 16, 2012
Tweet

Transcript

  1. Building Web Apps with Rack and Sinatra @blacktm

  2. Objectives ✔ Describe the HTTP request process ✔ Define Rack,

    describe its purpose ✔ Build a simple Rack web app ✔ Define, build, and use middleware ✔ Define DSL (compare with “framework”) ✔ Build a simple Sinatra app
  3. Things You’ll Need ✔ gem install thin ✔ gem install

    sinatra ✔ gem install heroku ✔ Project files and notes at blacktm.com
  4. HTML CSS JS Rails / Sinatra Ruby Deploy

  5. Web Server HTTP Request Middleware Rack Your App

  6. Web Server HTTP Request Middleware Rack Your App

  7. What is Rack? A modular web server interface. (Connects your

    Ruby app to the web.)
  8. None
  9. A common interface.

  10. Your App Rack Thin WEBrick Mongrel CGI

  11. What is a Rack app? A Ruby object that responds

    to a “call” method, taking a single hash parameter, and returning an array which contains the response status code, response headers, and response body as an array of strings. “In English, please.”
  12. $ rackup config.ru Run it! Open “simple_rack” and edit the

    “config.ru” file. # config.ru - rackup file require 'rack' class MyApp def call(env) headers = { "Content-Type" => "text/html" } [200, headers, ["Hello world!"]] end end run MyApp.new
  13. http://0.0.0.0:9292 #=> Hello world! http://0.0.0.0:9292/there/isnt/a/route/here #=> Hello world! A very

    basic server.
  14. Who cares? ✔ You just built a web app. Damn.

    ✔ Important in understanding (and building) web frameworks (e.g. Rails) ✔ Middleware!
  15. HTTP Request Middleware Rack Your App Web Server

  16. HTTP Request Middleware Rack Your App Web Server

  17. Let’s explore Middleware! 1. Open “rack_middleware” 2. Stop the server

    (ctrl-c) 3. Run: $ rackup config.ru 4. Open: http://0.0.0.0:9292 or: http://localhost:9292
  18. None
  19. Rack’s Default Middleware (in development mode): Rack::CommonLogger Rack::ShowExceptions Rack::Lint

  20. # app.rb class MyApp def call(env) puts "Hello from MyAPP"

    return [200, {}, ["Hello"]] end end No “Content-Type”
  21. Solution? Middleware!

  22. class ContentType def initialize(app) @app = app end def call(env)

    status, headers, body = @app.call(env) puts "Hello from ContentType" # TODO: Add "Content-Type" to the HTTP # headers and return the response. end end Open “config.ru”
  23. Add the “Content-Type” to the headers. # TODO: Add "Content-Type"

    to the HTTP # headers and return the response. headers.merge!( "Content-Type" => "text/html" ) return [status, headers, body]
  24. class FinishSentence def initialize(app) @app = app end def call(env)

    status, headers, body = @app.call(env) puts "Hello from FinishSentence" # TODO: Add " world!" to the HTTP # body and return the response. end end
  25. Add the “ world!” to the body. # TODO: Add

    " world!" to the HTTP # body and return the response. body.push(" world!") return [status, headers, body]
  26. Use the middleware. # TODO: Tell the app to use

    the "ContentType" # and "FinishSentence" middleware. use ContentType use FinishSentence
  27. Run it! $ rackup config.ru http://0.0.0.0:9292 127.0.0.1 - - [13/Oct/2012

    21:18:58] "GET / HTTP/1.1" 200 12 0.0009
  28. rack_middleware:$ rackup config.ru >> Thin web server (v1.5.0 codename Knife)

    >> Maximum connections set to 1024 >> Listening on 0.0.0.0:9292, CTRL+C to stop Hello from MyAPP Hello from FinishSentence Hello from ContentType 127.0.0.1 - - [14/Nov/2012 17:01:07] "GET / HT {
  29. What’s wrong with this?

  30. What’s wrong with this?

  31. None
  32. None
  33. “Sinatra is a DSL for quickly creating web applications in

    Ruby with minimal e ort.” A “human interface” to Rack. “Domain Specific Language”
  34. None
  35. HTTP Request Middleware Rack Your App Web Server

  36. HTTP Request Middleware Rack Your App Web Server

  37. HTTP Request Middleware Rack Your App Sinatra Web Server

  38. The Showdown Plain ‘ol Rack Sinatra get '/' do "Hello

    world!" end class MyApp def call(env) headers = { "Content-Type" => "text/html" } [200, headers, ["Hello world!"]] end end
  39. $ rackup config.ru Run it! Open “simple_sinatra” and edit the

    “config.ru” file. # config.ru require 'sinatra' get '/' do "Hello Sinatra!" end run Sinatra::Application
  40. What else can do?

  41. # config.ru require 'sinatra' get '/' do "Hello Sinatra!" end

    get '/hello/:name' do |n| "Hello #{n}!" end get '/wildcard/*' do request.inspect end error 404 do "OMG, 404!" end get '/breakit' do 500 end run Sinatra::Application
  42. None
  43. Rails email database ajax orm csrf routes tests sessions models

    views controllers “A full-stack web application framework.” logging tasks
  44. Middleware Rack Your App Rails Web Server Middleware Rack Your

    App Sinatra Web Server
  45. Middleware Rack Your App Web Server Middleware Rack Your App

    Sinatra Web Server RAILS
  46. None
  47. None
  48. None
  49. None
  50. me

  51. None
  52. None
  53. None
  54. Rack + Sinatra + DataMapper + Heroku Messages App

  55. Thanks! @blacktm