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 merb

Merb 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-flat

Zainteresowanym 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=tt
wyświetli w przeglądarce
Dostał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-ruby

Tworzymy projekt:

merb-gen app myproj

Zostanie 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 :sequel

Od 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-gen

Merb 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:
  <<: *defaults

Teraz 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 user

Teraz 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
end

Będąc w katalogu projektu, odpal polecenie: uruchamiające “proces migracji:http://code.google.com/p/ruby-sequel/wiki/Migrations:

rake sequel:db:migrate

Zostanie 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.

Tags ,  | 8 comments

Comments

  1. Avatar hoody said about 9 hours later:

    no to wypas, że będą materiały!

  2. Avatar dmilith said about 10 hours later:

    nie mogę się doczekać :}

  3. Avatar adam said 1 day later:

    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.

  4. Avatar przecietny said 1 day later:

    wreszcie merbik się zaczyna rozkręcać na dobre. ;)

    @adam: brak bibliotek do obsługi sqlite

  5. Avatar adam said 1 day later:

    Która to biblioteka? Bo sqlite3-ruby mam i z railsami działa.

  6. Avatar Jarosław Zabiełło said 1 day later:

    @adam: zmień w pliku database.yml sqlite3 na sqlite.

  7. Avatar adam said 2 days later:

    Teraz działa. Dzięki!

  8. Avatar neaf said 8 days later:

    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ł. :]

(leave url/email »)

   Comment Markup Help Preview comment