Kapitola 45. Sinatra

Obsah

45.1. git-wiki

Odkazy:

Sinatra is the easiest way to create a Fast, RESTful, web-application in Ruby with few dependancies, setup, and LOC.

Instalace s použitím RubyGems:

# gem install sinatra

Nyní si můžeme napsat první jednoduchý program:

  1 #!/usr/bin/env ruby
  2 require 'rubygems'
  3 require 'sinatra'
  4 get '/hi' do
  5   "Hello World!"
  6 end
  7 

Program spusítme a prohlížečem se podíváme na http://localhost:4567/hi.

$ ./hello.rb
== Sinatra/1.0 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.2.7 codename No Hup)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop

Na příkladu, na čtvrtém řádku, je vidět jak se mapuje kód na http dotazy. K tomuto mapování se používají příkazy get, post, put a delete. Mapovací metody mají jako parametr řetězec popisující část url. V tomto popisu můžeme použít "proměnné". Například v mapování

get '/hello/:name'

je :name symbol pojmenovávající parametr na daném místě. Http příkaz GET /hello/Karel je tedy zachycen mapováním '/hello/:name' a hodnotou 'Karel' je naplněn parametr params[:name].

get '/say/*/to/*' do
  params[:splat].inspect
end
# GET http://localhost:4567/say/hello/to/radek
# => ["hello", "radek"]

Parametrů, proměnných, v cestě může být více. Můžeme dokonce použít anonymní parametry. Takové parametry zastupuje znak '*'.

get '/say/*/to/*' do |pole|
  pole.inspect
end
# http://localhost:4567/say/hello/to/Radek
# => ["hello", "Radek"]
# warning: multiple values for a block parameter (2 for 1)

V této ukázce nám Sinatra vypíše varování. V cestě jsme definovali dva parametry, ale v bloku kódu přebíráme jen jeden. Sinatra se s tím vyrovná tak, že nám vrátí pole všech parametrů.

get '/say/:msg/to/:name' do |m,n|
  "m=#{m}, n=#{n}"
end
# http://localhost:4567/say/hello/to/Karel
# => m=hello, n=Karel

Mapování může provádat také regulárním výrazem

get %r{/hello/([\w]+)/(.*)} do
  "Hello, #{params.inspect}"
end
# http://localhost:4567/hello/Jana/Pavel
# => Hello, {"captures"=>["Jana", "Pavel"]}
get %r{/hello/([\w]+)/(.*)} do |f,m|
  "Pár: #{f} a #{m}"
end
# http://localhost:4567/hello/Jana/Pavel
# => Pár: Jana a Pavel

Při mapování můžeme mimo cestu zadat i podmínky. V těchto podmínkách můžeme testovat

Pomocné metody

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .