niedziela, 22 marca 2009

Sinatra

Dzisiaj będzie o Sinatrze, nie o Franku Sinatrze, słynnym wokaliście, ale o frameworku nazwanym jego nazwiskiem. Framework napisany jest w Ruby. Czerpie nieco z Merba, z Ruby on Rails. Jest na tyle ciekawy, że najprostsza aplikacja zawiera się w kilku linijkach:


#sinatraweb.rb
require 'rubygems'
require 'sinatra'

get '/' do
"Hello World!"
end


Po czym w konsoli odpalamy:


gem install sinatra ; instalujemy gem sinatra
ruby websinatra.rb


A w przeglądarce wchodzimy pod adres http://localhost:4567 i gotowe, pierwsza aplikacja w Sinatrze została uruchomiona. Może wynik nie imponuje, bo to tylko sam tekst, ale w ciągu kilku minut udało się uruchomić aplikację, działającą na własnym serwerze.

W tym przypadku Ruby on Rails jest kolosem, w którym trzeba nieco bardziej się napracować aby cokolwiek zrobić ;) Dobra, koniec żartów i nabijania się bądź co bądź z bardzo dobrego frameworku. W Sinatrze, bez problemu można dodać layouty dla stron. Do katalogu, w którym znajduje się aplikacja dodajemy katalog views, do którego dodajemy plik layout.erb (Sinatra obsługuje także szablony haml, builder. Ja wybrałem erb gdyż znam go z RoR.):


<html>
<head>
<title>Sinatra</title>
</head>
<body>
<div>
<h1>Sing!</h1>
</div>
<div>
<%= yield %>
</div>
</body>
</html>


Słowo yield umieszczamy w miejscu gdzie ma pojawić się treść. W tym samym katalogu dodajemy kolejny plik, index.erb wyświetlający konkretną treść:


<p>
Witaj, może znajdziesz tu coś dla siebie!
Teraz jest: <%= @data %>
<p>


I jeszcze modyfikujemy główny plik aplikacji:


require 'rubygems'
require 'sinatra'

get '/' do
@data = DateTime.now
erb :index
end


Jak widzimy, sposób używania widoków wygląda podobnie jak w RoR. Poprzez metodę get definiujemy ścieżkę dostępu do zasobu a w bloku definiowane jest zachowanie kontrolera. Nie przypadkowo użyłem tu słowa "zasób" gdyż mamy od dyspozycji jeszcze metody: post, put i delete. Czyli istnieje możliwość implementacji kompletnego interfejsu REST.

Sinatra pozwala na napisanie aplikacji opartych o wzorzec Model-View-Controller, mimo iż w przykładowej aplikacji nie występuje żaden model. Nie narzuca też jakiegoś konkretnego rozwiązania, dlatego też można użyć ActiveRecord, Og, lub innych podobnych rozwiązań do połączenia się z bazą danych.