A Sinatra egy DSL, ami lehetővé teszi számunkra, hogy minimális energiabefektetéssel és gyorsan írhassunk egyszerű webalkalmazásokat.
A Rails vetélytársának nem igazán tekinthető, az ugyanis jóval összetettebb felépítésű és szélesebb körben használt keretrendszer, amit folyamatosan fejlesztenek és optimalizálnak.
Ellentétben a Rails-szel, a Sinatra-t akkor érdemes használni, ha az elkészítendő webalkalmazás kis méretű és egyszerű. Ezen alkalmazások esetében a Rails használata túlkapás lehet.
A myapp.rb fájl tartalma:
A gem feltelepítése:
Futtatás:
Az alkalmazást a http://localhost:4567 url-en érhetjük el.
A Sinatra-ban egy route egy http metódus és egy url minta párjaként áll elő. Minden egyes route-hoz tartozik egy blokk. A route-hoz tartozó blokkban definiálhatjuk a megfelelő http kérésekre vonatkozó reakciót, azaz a blokkban adhatjuk meg, hogy milyen választ adjon a szerver az egyes kérésekre.
A route-ok a definiciójuk sorrendjében jutnak érvényre. Tehát, ha egy olyan http kérés érkezik a szerverre, ami két route-nak is megfeleltethető lenne a típusa és a mintája alapján, akkor a sorrendben előbb definiált route-hoz tartozó blokk értékelődne ki és az adná meg a választ a kérésre.
Egy webalkalmazás esetében gyakran előfordul, hogy az urlnek tartalmaznia kell nevesített paramétereket. Ahogy a következő kódrészletből is látható, a mintában a ":" karakterrel jelölhetjük meg, hogy mi legyen paraméternév, a blokkon belül pedig a params nevű asszociatív tömbből kérhetjük le a változó értékét.
A nevesített paramétereket a blokk változójaként is elérhetjük.
A route paraméterek lehetnek joker karakterek is.
Ezek is használhatók blokk-változóként.
A route minták leírhatók a Regexp osztály példányai segítségével is.
Ebben az esetben is van lehetőség a blokk-változók használatára is.
A route minták esetében opcionális paraméterek kezelésére is szükség lehet.
Az egyéb, nem nevesített paraméterek kezelése szintén a params nevű asszociatív tömb segítségével végezhető el.
A route-ok esetében egyéb korlátozások is szükségesek lehetnek. Például megadhatjuk, hogy egy adott route-hoz tartozóan csak html választ vagyunk hajlandóak adni, míg ugyanazon mintának megfelelő kérésre json választ egy másik route segítségével adunk.
Természetesen definiálhatunk saját feltételeket is. A következő példában a feltételünk dinamikusan változik. Annak függvényében választja az egyik, vagy a másik blokkot, hogy a rand metódus segítségével generált érték nagyobb-e a példában megadott 0.1 értéknél.
A feltételek kezelése lehetővé teszi a felhasználók egyszerű authentikációját is.
A statikus fájlokat alapértelmezetten a rendszer a ./public könyvtárban keresi, de ez konfigurálható.
Fontos megjegyezni, hogy a publikus könyvtár neve nem része a könyvtárban található fájlok url-jének. Például a ./public/css/style.css a http://example.com/css/style.css url-en válik elérhetővé.
Az alkalmazás a sablonokat a views könyvtárban keresi. Minden egyes sablonnyelvet a saját kiértékelő metódusával alkalmazhatunk.
Az utóbbi példa a views/index.erb fájlt rajzolja ki a kérésre adott válaszként.
A sablon neve helyett a sablon tartalma direktben is megadható.
A before és after szűrők lefutnak minden egyes olyan kérés előtt és után, amiknek a környezete megfelel a szűrőben megadottnak. A következő példában látható szűrő például lefut minden olyan kérés előtt, aminek url-je illeszthető a '/protected/*' mintára.
A szűrőkben állíthatunk be példány változókat, amik módosíthatják a kérést és a választ egyaránt.
Gyakran ismételt folyamatokat érdemes segéd metódusokként definiálni, így csökkentve a redundanciát.
Ez egy egyszerű példaalkalmazás a Sinatra keretrendszer használatára.
A futtatáshoz telepíteni szükséges a sinatra gem-et.
Az adatok egy fájlban tárolódnak YAML formátumban. Az adatokat tároló fájl inicializálásához a következő parancsot szükséges futtatni a program gyyökérkönyvtárában:
Ezt követően a rendszer a http://0.0.0.0:4567 url-en érhető el. Az inicializálás során létrehozott felhasználó neve: "Test Admin", ezzel a névvel be lehet jelentkezni a rendszerbe.
Forráskód letöltése