Merb 0.9.2 - szybki start
Posted by Jarosław Zabiełło Sun, 30 Mar 2008 23:09:00 GMT
Żyjemy w czasach przeładowania informacją. Większości ludzi nie chce się czytać dokładnych dokumentacji, czy kilkuset stronicowych książek. Nie dziwię się, że Rails spotkał się z entuzjastycznym przyjęciem ze strony osób zmęczonych walką z konfiguracją frameworków Javy czy chaosem i nieelegancją kodu PHP.
Merb pokazał że można jeszcze prościej i czytelniej niż zrobiono w Rails. To dobra informacja dla paranoików bojących się Railsów, którzy chcą czegoś bardzo prostego, aby nie musieć korzystać z PHP. I tu okazuje się, że Merb potrafi stworzyć sprawnie działający projekt prościej (i czytelniej) niż przykład użycia serwletu dostępny na stronie domowej Webricka. Merb jest też o wiele prostszy i bardziej intuicyjny niż pythonowe frameworki Django, Pylons czy TurboGears (nie mówiąc o pehapowych).
Najnowsza wersja stabilna Merba (0.9.2) jest dostępna normalnie w gemach. (Napisałem “stabilna”, mimo że formalnie jest to jeszcze wersja developerska, gdyż Ezra Zygmuntowicz uważa ją za wystarczająco dopracowaną aby móc używać do czegoś poważniejszego.) Instalacja jest więc standardowa:
sudo gem install merbMerb w przeciwieństwie do Rails, używa jednego skryptu generatora kodu na wszystko – merb-gen (Rails używa skryptu “rails” oraz dodatkowych generatorow obecnych w katalogu scripts/). Standardowo można stworzyć trzy rodzaje projektów. Pełny, okrojony i minimalistyczny.
merb-gen app pelny
merb-gen app okrojony --flat
merb-gen app minimalny --very-flatZainteresowanym polecam porównanie sobie kodu wygenerowanego w każdym z trzech przypadków. Dla tych, co chcieliby minimum kodu, ostatnia opcja może być dosyć atrakcyjna.
Projekt minimalny
W wypadku użycia opcji --very-flat zostaną stworzone 2 (słownie: dwa) pliki. Jeden to README (z informacją, że całość odpala się za pomocą komendy: merb -I minimalny.rb), a drugi to kod Rubiego z całym frameworkiem. Załóżmy, że chcemy prosto przekazać parametry z URL do kontrolera. Wejście na stronę
http://localhost:4000/?a=test&b=ttDostałem parametry: {"a"=>"test", "b"=>"tt", "action"=>"index", "controller"=>"minimalny"}Cały kod frameworka sprowadzi się do jednego pliku:
Merb::Router.prepare do |r|
r.match('/').to(:controller => 'minimalny', :action =>'index')
end
class Minimalny < Merb::Controller
def index
"Dostałem parametry: #{params.inspect}"
end
end
Merb::Config.use { |c|
c[:framework] = {},
c[:session_store] = 'none',
c[:exception_details] = true
}W praktyce oczywiście wygodniej jest używać pełnego projektu, bo daje wygodny dostęp do ORM, szablonów i wszystkich możliwości jakie oferuje Merb.
Projekt pełny – szybki start
Załóżmy, dla prostoty, że chcemy jakiejś bardzo prostej metody składowania danych i nie chcemy korzystać (przynajmniej na początku) z pełnych serwerów takich jak MySQL czy PostgreSQL. Doskonałym wyborem w takiej sytuacji będzie SQLite. Baza sprowadza się do jednego pliku, jest szybka i umożliwia korzystanie z języka SQL (włącznie z transakcjami). Instaluje się ją z gemow:
sudo gem install sqlite3-rubyTworzymy projekt:
merb-gen app myprojZostanie stworzony katalog myproj z różnymi plikami i katalogami w środku. To jest szkielet aplikacji i jest nawet prostszy od tego co generują Rails.
Domyślnie Merb nie zakłada, że chcemy korzystać z baz danych. Aby uaktywnić obsługę bazy danych, wejdź do pliku config/init.rb i odkomentować jedną linijkę z trzech dostępnych bibliotek zapewniających obiektowy dostęp do relacyjnej bazy danych: Active Record, DataMapper lub Sequel. Załóżmy, że wybraliśmy ten trzeci (mój ulubiony ze względu na prostotę i elastyczność; oczywiście zakładam, że wcześniej zainstalowaliśmy: sudo gem install sequel)
use_orm :sequelOd tej chwili Merb będzie zakładał, że chcemy pracować z bazą danych za pomocą Sequela. To znacznie uprości to pracę z samą bazą SQLite i ułatwi ewentualne przepięcie aplikacji ze SQLite do MySQL czy innej bazy. Teraz przejdź do konsoli i odpal w katalogu projektu polecenie:
merb-genMerb już wie, że chcesz używać bazy, więc teraz automatycznie stworzy teraz plik konfiguracyjny config/database.sample.yml. Należy zmienić jego nazwę database.yml. Domyślnie tworzone są tam ustawienia dla MySQL. Aby użyć SQLite, zmień go na:
---
:development: &defaults
:adapter: sqlite
:database: baza.db
:encoding: utf8
:test:
<<: *defaults
:database: baza-testowa.db
:production:
<<: *defaultsTeraz stworzmy jakiś przykładowy model danych z użytkownikami i kontroler do ich zarządzania. Stwórzmy od razu cały zasób z obsługą REST.
merb-gen resource userTeraz przejdź do pliku schema/migrations/001_user.rb i zmień go na
class UserMigration < Sequel::Migration
def up
create_table :users do
varchar :name, :unique => true
primary_key :id
end
end
def down
execute "DROP TABLE users"
end
endBędąc w katalogu projektu, odpal polecenie: uruchamiające “proces migracji:http://code.google.com/p/ruby-sequel/wiki/Migrations:
rake sequel:db:migrateZostanie stworzona baza (plik: baza.db) oraz tabela users. No to teraz trochę się pobawmy interaktywną konsolą aby dodać jakieś dane do bazy.
$ merb -i
~ Loaded DEVELOPMENT Environment...
~ loading gem 'merb_sequel' from ...
~ Connecting to the 'baza.db' database on '' using 'sqlite' ...
~ Compiling routes...
~ Using 'share-nothing' cookie sessions (4kb limit per client)
User.create :name => 'Jarek'
=> #<User @values={:name=>"Jarek", :id=>1}>
User.create :name => 'Ewa'
=> #<User @values={:name=>"Ewa", :id=>2}>
User.all
=> [#<User @values={:name=>"Jarek", :id=>1}>, #<User @values={:name=>"Ewa", :id=>2}>]OK. Ostatni krok. Otwórz plik app/views/users/index.html.erb i wstaw:
<p>W bazie mam użytkowników o imionach:</h1>
<% for user in @users %>
<p><%= user.name %></p>
<% end %>To wszystko! Odpal serwer z aplikacją za pomocą komendy: merb
(więcej: merb --help) i otwórz stronę http://localhost:4000/users
Dodatkowe informacje
Ezra Zygmuntowicz zapowiedział intensywne prace nad stworzeniem zestawu manuali i dodatkowej dokumentacji dla Merba. Na razie musi wystarczyć to, co jest dostępne na stronie projektu plus informacje dostępne w blogach i na kanale IRC #merb serwera freenode.net. Powstaje też książka która jest dostępna w wersji roboczej przez PeepCode. API Merba jest dosyć przejrzyście opisane i co ważniejsze, przyjęto ścisłe zasady tworzenia dokumentacji, która były opisane wszystkie możliwe parametry dla każdej metody plus jakiś przykład użycia.


Kanały IRC![[Dilber w Onecie]](/images/larry.png)


no to wypas, że będą materiały!
nie mogę się doczekać :}
Próba utworzenia zasobu “user” daje komunikat o błędzie:
Could not load sqlite3 adapter: (Sequel::Error::AdapterNotFound)
Wszystko robię tak jak w artykule. Ten sam błąd pod Ubuntu i pod Windows XP.
wreszcie merbik się zaczyna rozkręcać na dobre. ;)
@adam: brak bibliotek do obsługi sqlite
Która to biblioteka? Bo sqlite3-ruby mam i z railsami działa.
@adam: zmień w pliku database.yml sqlite3 na sqlite.
Teraz działa. Dzięki!
Merb rzeczywiście rośnie na całkiem ładny kawałek kodu, jednak zaczynałem od Django i nie do końca mogę się zgodzić, że Merb jest łatwiejszy do ogarnięcia. Chociaż aktualnie to wina małego supportu i braku dostępu do tutoriali i informacji, więc za niedługo powinno się to zmienić. :)
P.S Ktoś chce o coś zapytać Ezrę? ;) Jutro człowiek, z którym teraz pracuję nad pewną rzeczą w Merbie będzie się z nim widział. :]