2013-03-01 16:37:05 -05:00
|
|
|
# Sinatra
|
|
|
|
*Fontos megjegyzés: Ez a dokumentum csak egy fordítása az angol nyelvű
|
2015-01-23 13:33:33 -05:00
|
|
|
változatnak, és lehet, hogy nem naprakész.*
|
2013-03-01 16:37:05 -05:00
|
|
|
|
2016-01-21 11:39:23 -05:00
|
|
|
A Sinatra egy [DSL](https://en.wikipedia.org/wiki/Domain-specific_language)
|
2013-03-01 16:37:05 -05:00
|
|
|
webalkalmazások Ruby nyelven történő fejlesztéséhez, minimális
|
|
|
|
energiabefektetéssel:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
# myapp.rb
|
|
|
|
require 'sinatra'
|
|
|
|
get '/' do
|
|
|
|
'Helló Világ!'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Telepítsd a gem-et és indítsd el az alkalmazást a következőképpen:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
sudo gem install sinatra
|
|
|
|
ruby myapp.rb
|
|
|
|
```
|
|
|
|
|
2016-01-21 20:09:12 -05:00
|
|
|
Az alkalmazás elérhető lesz itt: [http://localhost:4567](http://localhost:4567)
|
2013-03-01 16:37:05 -05:00
|
|
|
|
|
|
|
## Útvonalak (routes)
|
|
|
|
|
|
|
|
A Sinatrában az útvonalat egy HTTP metódus és egy URL-re illeszkedő minta
|
|
|
|
párosa alkotja. Minden egyes útvonalhoz tartozik egy blokk:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/' do
|
|
|
|
.. megjelenítünk valamit ..
|
|
|
|
end
|
|
|
|
|
|
|
|
post '/' do
|
|
|
|
.. létrehozunk valamit ..
|
|
|
|
end
|
|
|
|
|
|
|
|
put '/' do
|
|
|
|
.. frissítünk valamit ..
|
|
|
|
end
|
|
|
|
|
|
|
|
delete '/' do
|
|
|
|
.. törlünk valamit ..
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Az útvonalak illeszkedését a rendszer a definiálásuk sorrendjében
|
|
|
|
ellenőrzi. Sorrendben mindig az első illeszkedő útvonalhoz tartozó metódus kerül
|
|
|
|
meghívásra.
|
|
|
|
|
|
|
|
Az útvonalminták tartalmazhatnak paramétereket is, melyeket a `params`
|
|
|
|
hash-ből érhetünk el:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/hello/:name' do
|
|
|
|
# illeszkedik a "GET /hello/foo" és a "GET /hello/bar" útvonalakra
|
2015-02-04 14:07:07 -05:00
|
|
|
# ekkor params['name'] értéke 'foo' vagy 'bar' lesz
|
|
|
|
"Helló #{params['name']}!"
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
A kulcsszavas argumentumokat (named parameters) blokk paraméterek útján
|
|
|
|
is el tudod érni:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/hello/:name' do |n|
|
|
|
|
"Helló #{n}!"
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2013-09-16 09:02:43 -04:00
|
|
|
Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
|
2015-02-04 14:07:07 -05:00
|
|
|
`params['splat']` tömbön keresztül tudunk elérni.
|
2013-03-01 16:37:05 -05:00
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/say/*/to/*' do
|
|
|
|
# illeszkedik a /say/hello/to/world mintára
|
2015-02-04 14:07:07 -05:00
|
|
|
params['splat'] # => ["hello", "world"]
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
get '/download/*.*' do
|
|
|
|
# illeszkedik a /download/path/to/file.xml mintára
|
2015-02-04 14:07:07 -05:00
|
|
|
params['splat'] # => ["path/to/file", "xml"]
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Reguláris kifejezéseket is felvehetünk az útvonalba:
|
|
|
|
|
|
|
|
```ruby
|
2016-07-25 02:05:59 -04:00
|
|
|
get /\/hello\/([\w]+)/ do
|
2015-02-04 14:07:07 -05:00
|
|
|
"Helló, #{params['captures'].first}!"
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Vagy blokk paramétereket:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get %r{/hello/([\w]+)} do |c|
|
|
|
|
"Helló, #{c}!"
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Az útvonalak azonban számos egyéb illeszkedési feltétel szerint is
|
|
|
|
tervezhetők, így például az user agent karakterláncot alapul véve:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
2015-02-04 14:07:07 -05:00
|
|
|
"A Songbird #{params['agent'][0]} verzióját használod"
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
get '/foo' do
|
|
|
|
# illeszkedik az egyéb user agentekre
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
## Statikus állományok
|
|
|
|
|
|
|
|
A statikus fájlok kiszolgálása a `./public` könyvtárból
|
|
|
|
történik, de természetesen más könyvtárat is megadhatsz erre a célra,
|
|
|
|
mégpedig a :public_folder kapcsoló beállításával:
|
|
|
|
|
|
|
|
set :public_folder, File.dirname(__FILE__) + '/static'
|
|
|
|
|
2014-05-11 07:38:52 -04:00
|
|
|
Fontos megjegyezni, hogy a nyilvános könyvtár neve nem szerepel az URL-ben.
|
2013-03-01 16:37:05 -05:00
|
|
|
A ./public/css/style.css fájl az
|
|
|
|
`http://example.com/css/style.css` URL-en lesz elérhető.
|
|
|
|
|
|
|
|
## Nézetek és Sablonok
|
|
|
|
|
|
|
|
A sablonfájlokat rendszerint a `./views` könyvtárba helyezzük, de
|
|
|
|
itt is lehetőség nyílik egyéb könyvtár használatára:
|
|
|
|
|
|
|
|
set :views, File.dirname(__FILE__) + '/templates'
|
|
|
|
|
|
|
|
Nagyon fontos észben tartani, hogy a sablononkra mindig szimbólumokkal
|
2013-09-16 09:02:43 -04:00
|
|
|
hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
|
2013-03-01 16:37:05 -05:00
|
|
|
:'subdir/template') könyvtárban tároljuk őket. A renderelő
|
|
|
|
metódusok minden, nekik közvetlenül átadott karakterláncot megjelenítenek.
|
|
|
|
|
|
|
|
### Haml sablonok
|
|
|
|
|
|
|
|
HAML sablonok rendereléséhez szükségünk lesz a haml gem-re vagy könyvtárra:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
# Importáljuk be a haml-t az alkalmazásba
|
|
|
|
require 'haml'
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
haml :index
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Ez szépen lerendereli a `./views/index.haml` sablont.
|
|
|
|
|
|
|
|
A [Haml kapcsolói](http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html)
|
|
|
|
globálisan is beállíthatók a Sinatra konfigurációi között, lásd az
|
|
|
|
[Options and Configurations](http://www.sinatrarb.com/configuration.html) lapot.
|
|
|
|
A globális beállításokat lehetőségünk van felülírni metódus szinten is.
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
set :haml, {:format => :html5 } # az alapértelmezett Haml formátum az :xhtml
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
haml :index, :haml_options => {:format => :html4 } # immár felülírva
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
### Erb sablonok
|
|
|
|
|
|
|
|
# Importáljuk be az erb-t az alkalmazásba
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'erb'
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
erb :index
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Ez a `./views/index.erb` sablont fogja lerenderelni.
|
|
|
|
|
|
|
|
### Builder sablonok
|
|
|
|
|
|
|
|
Szükségünk lesz a builder gem-re vagy könyvtárra a builder sablonok
|
|
|
|
rendereléséhez:
|
|
|
|
|
|
|
|
# Importáljuk be a builder-t az alkalmazásba
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'builder'
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
builder :index
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Ez pedig a `./views/index.builder` állományt fogja renderelni.
|
|
|
|
|
|
|
|
### Sass sablonok
|
|
|
|
|
|
|
|
Sass sablonok használatához szükség lesz a haml gem-re vagy könyvtárra:
|
|
|
|
|
|
|
|
# Be kell importálni a haml, vagy a sass könyvtárat
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'sass'
|
|
|
|
|
|
|
|
get '/stylesheet.css' do
|
|
|
|
sass :stylesheet
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Így a `./views/stylesheet.sass` fájl máris renderelhető.
|
|
|
|
|
|
|
|
A [Sass kapcsolói](http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html)
|
|
|
|
globálisan is beállíthatók a Sinatra konfigurációi között, lásd az
|
|
|
|
[Options and Configurations](http://www.sinatrarb.com/configuration.html) lapot.
|
|
|
|
A globális beállításokat lehetőségünk van felülírni metódus szinten is.
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
set :sass, {:style => :compact } # az alapértelmezett Sass stílus a :nested
|
|
|
|
|
|
|
|
get '/stylesheet.css' do
|
|
|
|
sass :stylesheet, :sass_options => {:style => :expanded } # felülírva
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
### Beágyazott sablonok
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/' do
|
|
|
|
haml '%div.title Helló Világ'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Lerendereli a beágyazott sablon karakerláncát.
|
|
|
|
|
|
|
|
### Változók elérése a sablonokban
|
|
|
|
|
|
|
|
A sablonok ugyanabban a kontextusban kerülnek kiértékelésre, mint az
|
|
|
|
útvonal metódusok (route handlers). Az útvonal metódusokban megadott
|
|
|
|
változók közvetlenül elérhetőek lesznek a sablonokban:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/:id' do
|
2015-02-04 14:07:07 -05:00
|
|
|
@foo = Foo.find(params['id'])
|
2013-03-01 16:37:05 -05:00
|
|
|
haml '%h1= @foo.name'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
De megadhatod egy lokális változókat tartalmazó explicit hash-ben is:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/:id' do
|
2015-02-04 14:07:07 -05:00
|
|
|
foo = Foo.find(params['id'])
|
2013-03-01 16:37:05 -05:00
|
|
|
haml '%h1= foo.name', :locals => { :foo => foo }
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Ezt leginkább akkor érdemes megtenni, ha partial-eket akarunk renderelni
|
|
|
|
valamely más sablonból.
|
|
|
|
|
|
|
|
### Fájlon belüli sablonok
|
|
|
|
|
|
|
|
Sablonokat úgy is megadhatunk, hogy egyszerűen az alkalmazás fájl
|
|
|
|
végére begépeljük őket:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'rubygems'
|
|
|
|
require 'sinatra'
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
haml :index
|
|
|
|
end
|
|
|
|
|
|
|
|
__END__
|
|
|
|
|
|
|
|
@@ layout
|
|
|
|
%html
|
|
|
|
= yield
|
|
|
|
|
|
|
|
@@ index
|
|
|
|
%div.title Helló Világ!!!!!
|
|
|
|
```
|
|
|
|
|
|
|
|
Megjegyzés: azok a fájlon belüli sablonok, amelyek az alkalmazás fájl végére
|
|
|
|
kerülnek és függnek a sinatra könyvtártól, automatikusan betöltődnek.
|
2013-09-16 09:02:43 -04:00
|
|
|
Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
|
2013-03-01 16:37:05 -05:00
|
|
|
a <tt>use_in_file_templates!</tt> metódust az adott fájlban.
|
|
|
|
|
|
|
|
### Kulcsszavas sablonok
|
|
|
|
|
2013-09-16 09:02:43 -04:00
|
|
|
Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
|
|
|
|
definiálhatunk:
|
2013-03-01 16:37:05 -05:00
|
|
|
|
|
|
|
```ruby
|
|
|
|
template :layout do
|
|
|
|
"%html\n =yield\n"
|
|
|
|
end
|
|
|
|
|
|
|
|
template :index do
|
|
|
|
'%div.title Helló Világ!'
|
|
|
|
end
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
haml :index
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Ha létezik "layout" nevű sablon, akkor az minden esetben meghívódik, amikor
|
|
|
|
csak egy sablon renderelésre kerül. A layoutokat ki lehet kapcsolni a
|
|
|
|
`:layout => false` meghívásával.
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/' do
|
|
|
|
haml :index, :layout => !request.xhr?
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
## Helperek
|
|
|
|
|
|
|
|
Használd a felső szintű <tt>helpers</tt> metódust azokhoz a helper
|
|
|
|
függvényekhez, amiket az útvonal metódusokban és a sablonokban akarsz
|
|
|
|
használni:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
helpers do
|
|
|
|
def bar(name)
|
|
|
|
"#{name}bar"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get '/:name' do
|
2015-02-04 14:07:07 -05:00
|
|
|
bar(params['name'])
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
## Szűrők (filters)
|
|
|
|
|
|
|
|
Az előszűrők (before filter) az adott hívás kontextusában minden egyes
|
|
|
|
kérés alkalmával kiértékelődnek, így módosíthatják a kérést és a
|
|
|
|
választ egyaránt. A szűrőkbe felvett példányváltozók elérhetőek lesznek
|
|
|
|
az útvonalakban és a sablonokban is:
|
|
|
|
|
2013-03-21 05:20:32 -04:00
|
|
|
```ruby
|
2013-03-01 16:37:05 -05:00
|
|
|
before do
|
|
|
|
@note = 'Csá!'
|
|
|
|
request.path_info = '/foo/bar/baz'
|
|
|
|
end
|
|
|
|
|
|
|
|
get '/foo/*' do
|
|
|
|
@note #=> 'Szeva!'
|
2015-02-04 14:07:07 -05:00
|
|
|
params['splat'] #=> 'bar/baz'
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Az utószűrők az egyes kérések után, az adott kérés kontextusában kerülnek
|
|
|
|
kiértékelésre, így ezek is képesek módosítani a kérést és a választ egyaránt.
|
|
|
|
Az előszűrőkben és úvonalakban létrehozott példányváltozók elérhetőek lesznek
|
|
|
|
az utószűrők számára:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
after do
|
|
|
|
puts response.status
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
## Megállítás
|
|
|
|
|
|
|
|
Egy kérés szűrőben vagy útvonalban történő azonnal blokkolásához
|
|
|
|
használd a következő parancsot:
|
|
|
|
|
|
|
|
halt
|
|
|
|
|
|
|
|
A megállításkor egy blokktörzset is megadhatsz ...
|
|
|
|
|
|
|
|
halt 'ez fog megjelenni a törzsben'
|
|
|
|
|
|
|
|
Vagy állítsd be a HTTP státuszt és a törzset is egyszerre ...
|
|
|
|
|
|
|
|
halt 401, 'menj innen!'
|
|
|
|
|
|
|
|
## Passzolás
|
|
|
|
|
2013-09-16 09:02:43 -04:00
|
|
|
Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
|
2013-03-01 16:37:05 -05:00
|
|
|
a `pass` függvényhívással:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/guess/:who' do
|
2015-02-04 14:07:07 -05:00
|
|
|
pass unless params['who'] == 'Frici'
|
2013-03-01 16:37:05 -05:00
|
|
|
"Elkaptál!"
|
|
|
|
end
|
|
|
|
|
|
|
|
get '/guess/*' do
|
|
|
|
"Elhibáztál!"
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Az útvonal blokkja azonnal kilép és átadja a vezérlést a következő
|
|
|
|
illeszkedő útvonalnak. Ha nem talál megfelelő útvonalat, a Sinatra
|
|
|
|
egy 404-es hibával tér vissza.
|
|
|
|
|
|
|
|
## Beállítások
|
|
|
|
|
|
|
|
Csak indításkor, de minden környezetre érvényesen fusson le:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
configure do
|
|
|
|
...
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2016-08-01 07:14:48 -04:00
|
|
|
Csak akkor fusson le, ha a környezet (a APP_ENV környezeti változóban)
|
2013-03-01 16:37:05 -05:00
|
|
|
`:production`-ra van állítva:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
configure :production do
|
|
|
|
...
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Csak akkor fusson le, ha a környezet <tt>:production</tt> vagy <tt>:test</tt>:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
configure :production, :test do
|
|
|
|
...
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
## Hibakezelés
|
|
|
|
|
|
|
|
A hibakezelők ugyanabban a kontextusban futnak le, mint az útvonalak és
|
|
|
|
előszűrők, ezért számukra is elérhetőek mindazok a könyvtárak, amelyek
|
2013-09-16 09:02:43 -04:00
|
|
|
az utóbbiak rendelkezésére is állnak; így például a `haml`,
|
2013-03-01 16:37:05 -05:00
|
|
|
az `erb`, a `halt` stb.
|
|
|
|
|
|
|
|
### Nem található
|
|
|
|
|
|
|
|
Amikor a `Sinatra::NotFound` kivétel fellép, vagy a válasz HTTP
|
|
|
|
státuszkódja 404-es, mindig a `not_found` metódus hívódik meg.
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
not_found do
|
|
|
|
'Sehol sem találom, amit keresel'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
### Hiba
|
|
|
|
|
|
|
|
Az `error` metódus hívódik meg olyankor, amikor egy útvonal, blokk vagy
|
|
|
|
előszűrő kivételt vált ki. A kivétel objektum lehívható a
|
|
|
|
`sinatra.error` Rack változótól:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
error do
|
2014-08-14 04:48:02 -04:00
|
|
|
'Elnézést, de valami szörnyű hiba lépett fel - ' + env['sinatra.error'].message
|
2013-03-01 16:37:05 -05:00
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Egyéni hibakezelés:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
error MyCustomError do
|
|
|
|
'Szóval az van, hogy...' + env['sinatra.error'].message
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
És amikor fellép:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
get '/' do
|
|
|
|
raise MyCustomError, 'valami nem stimmel!'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Ez fog megjelenni:
|
|
|
|
|
|
|
|
Szóval az van, hogy... valami nem stimmel!
|
|
|
|
|
|
|
|
A Sinatra speciális `not_found` és `error` hibakezelőket
|
|
|
|
használ, amikor a futtatási környezet fejlesztői módba van kapcsolva.
|
|
|
|
|
|
|
|
## Mime típusok
|
|
|
|
|
|
|
|
A `send_file` metódus használatakor, vagy statikus fájlok
|
|
|
|
kiszolgálásakor előfordulhat, hogy a Sinatra nem ismeri fel a fájlok
|
|
|
|
mime típusát. Ilyenkor használd a +mime_type+ kapcsolót a fájlkiterjesztés
|
|
|
|
bevezetéséhez:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
mime_type :foo, 'text/foo'
|
|
|
|
```
|
|
|
|
|
|
|
|
## Rack Middleware
|
|
|
|
|
|
|
|
A Sinatra egy Ruby keretrendszerek számára kifejlesztett egyszerű és szabványos
|
2014-09-19 10:24:03 -04:00
|
|
|
interfészre, a [Rack](http://rack.github.io/) -re épül. A Rack fejlesztői
|
2013-03-01 16:37:05 -05:00
|
|
|
szempontból egyik legérdekesebb jellemzője, hogy támogatja az úgynevezett
|
|
|
|
"middleware" elnevezésű komponenseket, amelyek beékelődnek a szerver és az
|
2013-09-16 09:02:43 -04:00
|
|
|
alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
|
2013-03-01 16:37:05 -05:00
|
|
|
kéréseket és válaszokat. Segítségükkel különféle, egységesen működő
|
|
|
|
funkciókat építhetünk be rendszerünkbe.
|
|
|
|
|
|
|
|
A Sinatra keretrendszerben gyerekjáték a Rack middleware-ek behúzása a
|
|
|
|
`use` metódus segítségével:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'sinatra'
|
|
|
|
require 'my_custom_middleware'
|
|
|
|
|
|
|
|
use Rack::Lint
|
|
|
|
use MyCustomMiddleware
|
|
|
|
|
|
|
|
get '/hello' do
|
|
|
|
'Helló Világ'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2013-09-16 09:02:43 -04:00
|
|
|
A `use` metódus szemantikája megegyezik a
|
2016-01-21 11:39:23 -05:00
|
|
|
[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) DSL-ben
|
2013-03-01 16:37:05 -05:00
|
|
|
használt +use+ metóduséval (az említett DSL-t leginkább rackup állományokban
|
2013-09-16 09:02:43 -04:00
|
|
|
használják). Hogy egy példát említsünk, a `use` metódus elfogad
|
2013-03-01 16:37:05 -05:00
|
|
|
változókat és blokkokat egyaránt, akár kombinálva is ezeket:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
use Rack::Auth::Basic do |username, password|
|
|
|
|
username == 'admin' && password == 'titkos'
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
A Rack terjesztéssel egy csomó alap middleware komponens is érkezik,
|
2013-09-16 09:02:43 -04:00
|
|
|
amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
|
2013-03-01 16:37:05 -05:00
|
|
|
munkamenet-kezelés könnyen megvalósítható. A Sinatra ezek közül elég
|
|
|
|
sokat automatikusan felhasznál a beállításoktól függően, így ezek
|
|
|
|
explicit betöltésével (+use+) nem kell bajlódnod.
|
|
|
|
|
|
|
|
## Tesztelés
|
|
|
|
|
|
|
|
Sinatra teszteket bármely Rack alapú tesztelő könyvtárral vagy
|
|
|
|
keretrendszerrel készíthetsz. Mi a [Rack::Test](http://gitrdoc.com/brynary/rack-test)
|
|
|
|
könyvtárat ajánljuk:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'my_sinatra_app'
|
|
|
|
require 'rack/test'
|
|
|
|
|
2015-01-10 14:30:47 -05:00
|
|
|
class MyAppTest < Minitest::Test
|
2013-03-01 16:37:05 -05:00
|
|
|
include Rack::Test::Methods
|
|
|
|
|
|
|
|
def app
|
|
|
|
Sinatra::Application
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_my_default
|
|
|
|
get '/'
|
|
|
|
assert_equal 'Helló Világ!', last_response.body
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_with_params
|
|
|
|
get '/meet', :name => 'Frici'
|
|
|
|
assert_equal 'Helló Frici!', last_response.body
|
|
|
|
end
|
|
|
|
|
2016-08-01 07:14:48 -04:00
|
|
|
def test_with_user_agent
|
2013-03-01 16:37:05 -05:00
|
|
|
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
|
|
|
assert_equal "Songbird-öt használsz!", last_response.body
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
Megjegyzés: A beépített Sinatra::Test és Sinatra::TestHarness osztályok
|
|
|
|
a 0.9.2-es kiadástól kezdve elavultnak számítanak.
|
|
|
|
|
|
|
|
## Sinatra::Base - Middleware-ek, könyvtárak és moduláris alkalmazások
|
|
|
|
|
|
|
|
Az alkalmazást felső szinten építeni megfelelhet mondjuk egy kisebb
|
|
|
|
app esetén, ám kifejezetten károsnak bizonyulhat olyan komolyabb,
|
|
|
|
újra felhasználható komponensek készítésekor, mint például egy Rack
|
|
|
|
middleware, Rails metal, egyszerűbb kiszolgáló komponenssel bíró
|
|
|
|
könyvtárak vagy éppen Sinatra kiterjesztések. A felső szintű DSL
|
|
|
|
bepiszkítja az Objektum névteret, ráadásul kisalkalmazásokra szabott
|
|
|
|
beállításokat feltételez (így például egyetlen alkalmazásfájl,
|
|
|
|
`./public`
|
|
|
|
és `./views` könyvtár meglétét, naplózást, kivételkezelő oldalt stb.).
|
|
|
|
Itt jön a képbe a Sinatra::Base osztály:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
require 'sinatra/base'
|
|
|
|
|
|
|
|
class MyApp < Sinatra::Base
|
|
|
|
set :sessions, true
|
|
|
|
set :foo, 'bar'
|
|
|
|
|
|
|
|
get '/' do
|
|
|
|
'Helló Világ!'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
A MyApp osztály immár önálló Rack komponensként, mondjuk Rack middleware-ként
|
|
|
|
vagy alkalmazásként, esetleg Rails metal-ként is tud működni. Közvetlenül
|
|
|
|
használhatod (`use`) vagy futtathatod (`run`) az osztályodat egy rackup
|
|
|
|
konfigurációs állományban (`config.ru`), vagy egy szerverkomponenst
|
|
|
|
tartalmazó könyvtár vezérlésekor:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
MyApp.run! :host => 'localhost', :port => 9090
|
|
|
|
```
|
|
|
|
|
|
|
|
A Sinatra::Base gyermekosztályaiban elérhető metódusok egyúttal a felső
|
|
|
|
szintű DSL-en keresztül is hozzáférhetők. A legtöbb felső szintű
|
|
|
|
alkalmazás átalakítható Sinatra::Base alapú komponensekké két lépésben:
|
|
|
|
|
|
|
|
* A fájlban nem a `sinatra`, hanem a `sinatra/base` osztályt kell
|
|
|
|
beimportálni, mert egyébként az összes Sinatra DSL metódus a fő
|
|
|
|
névtérbe kerül.
|
|
|
|
* Az alkalmazás útvonalait, hibakezelőit, szűrőit és beállításait
|
|
|
|
a Sinatra::Base osztály gyermekosztályaiban kell megadni.
|
|
|
|
|
|
|
|
A `Sinatra::Base` osztály igazából egy üres lap: a legtöbb funkció
|
2013-09-16 09:02:43 -04:00
|
|
|
alapból ki van kapcsolva, beleértve a beépített szervert is. A
|
2013-03-01 16:37:05 -05:00
|
|
|
beállításokkal és az egyes kapcsolók hatásával az
|
2016-01-21 11:39:23 -05:00
|
|
|
[Options and Configuration](http://www.sinatrarb.com/configuration.html) lap
|
2013-03-01 16:37:05 -05:00
|
|
|
foglalkozik.
|
|
|
|
|
|
|
|
Széljegyzet: A Sinatra felső szintű DSL-je egy egyszerű delegációs
|
|
|
|
rendszerre épül. A Sinatra::Application osztály - a Sinatra::Base egy
|
|
|
|
speciális osztályaként - fogadja az összes :get, :put, :post,
|
|
|
|
:delete, :before, :error, :not_found, :configure és :set üzenetet,
|
|
|
|
ami csak a felső szintre beérkezik. Érdemes utánanézned a kódban,
|
|
|
|
miképp [kerül be](http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25)
|
|
|
|
a [Sinatra::Delegator mixin](http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064)
|
|
|
|
a fő névtérbe.
|
|
|
|
|
|
|
|
## Parancssori lehetőségek
|
|
|
|
|
|
|
|
Sinatra alkalmazásokat közvetlenül futtathatunk:
|
|
|
|
|
|
|
|
```
|
|
|
|
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
|
|
|
|
```
|
|
|
|
|
|
|
|
Az alábbi kapcsolókat ismeri fel a rendszer:
|
|
|
|
|
|
|
|
-h # segítség
|
|
|
|
-p # a port beállítása (alapértelmezés szerint ez a 4567-es)
|
|
|
|
-e # a környezet beállítása (alapértelmezés szerint ez a development)
|
|
|
|
-s # a rack szerver/handler beállítása (alapértelmezetten ez a thin)
|
|
|
|
-x # a mutex lock bekapcsolása (alapértelmezetten ki van kapcsolva)
|
|
|
|
|
2016-10-31 17:25:52 -04:00
|
|
|
## Több szálon futtatás
|
|
|
|
|
|
|
|
_Parafrázis [Konstantin StackOverflow válasza][so-answer] alapján_
|
|
|
|
|
|
|
|
A Sinatra nem szabja meg az konkurenciakezelés módját, hanem az alatta működő
|
|
|
|
Rack kezelőre (szerverre) hagyja ezt a feladatot, ami például a Thin, a Puma,
|
|
|
|
vagy a WEBrick. A Sinatra önmagában szálbiztos, tehát semmilyen probléma sem
|
|
|
|
adódik, ha a Rack kezelő többszálú konkurenciamodellt használ. Ezek szerint
|
|
|
|
szerverindításkor meg kell adni a Rack szervernek megfelelő indítási módot.
|
|
|
|
A következő példa egy többszálú Thin szerver indítását mutatja be.
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
# app.rb
|
|
|
|
|
|
|
|
require 'sinatra/base'
|
|
|
|
|
|
|
|
class App < Sinatra::Base
|
|
|
|
get '/' do
|
|
|
|
"Hello, World"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
App.run!
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
A szerverindítás parancsa a következő lenne:
|
|
|
|
|
|
|
|
``` shell
|
|
|
|
thin --threaded start
|
|
|
|
```
|
|
|
|
|
|
|
|
[so-answer]: http://stackoverflow.com/a/6282999/1725341
|
|
|
|
|
2013-03-01 16:37:05 -05:00
|
|
|
## Fejlesztői változat
|
|
|
|
|
|
|
|
Ha a Sinatra legfrissebb, fejlesztői változatát szeretnéd használni,
|
|
|
|
készíts egy helyi másolatot és indítsd az alkalmazásodat úgy,
|
2013-09-16 09:02:43 -04:00
|
|
|
hogy a `sinatra/lib` könyvtár elérhető legyen a
|
2013-03-01 16:37:05 -05:00
|
|
|
`LOAD_PATH`-on:
|
|
|
|
|
|
|
|
```
|
|
|
|
cd myapp
|
|
|
|
git clone git://github.com/sinatra/sinatra.git
|
|
|
|
ruby -Isinatra/lib myapp.rb
|
|
|
|
```
|
|
|
|
|
|
|
|
De hozzá is adhatod a <tt>sinatra/lib</tt> könyvtárat a <tt>LOAD_PATH</tt>-hoz
|
|
|
|
az alkalmazásodban:
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
|
|
|
|
require 'rubygems'
|
|
|
|
require 'sinatra'
|
|
|
|
|
|
|
|
get '/about' do
|
|
|
|
"A következő változatot futtatom " + Sinatra::VERSION
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
A Sinatra frissítését később így végezheted el:
|
|
|
|
|
|
|
|
```
|
|
|
|
cd myproject/sinatra
|
|
|
|
git pull
|
|
|
|
```
|
|
|
|
|
|
|
|
## További információk
|
|
|
|
|
2016-01-21 11:39:23 -05:00
|
|
|
* [A projekt weboldala](http://www.sinatrarb.com/) - Kiegészítő dokumentáció,
|
2013-03-01 16:37:05 -05:00
|
|
|
hírek, hasznos linkek
|
2016-01-21 11:39:23 -05:00
|
|
|
* [Közreműködés](http://www.sinatrarb.com/contributing.html) - Hibát találtál?
|
2013-03-01 16:37:05 -05:00
|
|
|
Segítségre van szükséged? Foltot küldenél be?
|
|
|
|
* [Lighthouse](http://sinatra.lighthouseapp.com) - Hibakövetés és kiadások
|
2016-01-21 11:39:23 -05:00
|
|
|
* [Twitter](https://twitter.com/sinatra)
|
2013-03-01 16:37:05 -05:00
|
|
|
* [Levelezőlista](http://groups.google.com/group/sinatrarb)
|
|
|
|
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) a http://freenode.net címen
|