Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Ruby on Rails.
Wprowadzenie
Autorzy: Bruce A. Tate, Curt Hibbs
Tumaczenie: Sawomir Dzieniszewski
ISBN: 83-246-0820-6
Tytu oryginau: Ruby on Rails: Up and Running
Format: B5, stron: 184
Spis treci
Przedmowa .....................................................................................................................5
1. Zaczynamy wprowadzenie do Rails .........................................................................9
Zalety Rails
Uruchamianie Rails
Organizacja Rails
Serwer WWW
Tworzenie kontrolera
Budowanie widoku
Wizanie kontrolera z widokiem
Co si dzieje za kulisami
Co dalej
10
12
13
15
18
21
23
26
26
27
30
32
34
36
39
43
45
48
51
52
63
64
4. Rusztowania .................................................................................................................65
Korzystanie z rusztowania
Zastpowanie rusztowania
Generowanie kodu rusztowania
W nastpnym rozdziale
65
68
71
75
77
79
80
86
87
90
95
103
104
107
111
119
123
124
126
138
Spis treci
ROZDZIA 1.
Wedug danych z maja 2006 r. rodowisko Rails w cigu poprzedzajcych t dat 12 mie-
sicy cigano z powiconej mu witryny ponad 500 000 razy. S to dane porwnywalne
z tymi, ktre dotycz wikszoci najbardziej popularnych rodowisk programowania dla
innych jzykw, rozpowszechnionych na zasadzie otwartego kodu rdowego1.
Rosnca popularno Rails jest rdem coraz gortszych debat w portalach koncentruj-
Liczba 500 000 to tak naprawd do ostrony szacunek. Takie dane uzyska mona ze statystyk cigania
oprogramowania, oferowanych przez najbardziej popularne narzdzie dystrybucji zwane gems (z ang. klejnoty). Niemniej istnieje rwnie wiele innych dystrybucji rodowiska Rails, takich jak Locomotive przeznaczone dla systemu Mac OS X. Dlatego te prawdziwe statystyki cigania rodowiska Rails s prawdopodobnie dwukrotnie wysze.
szybkie tworzenie aplikacji, dajc jednoczenie bardzo porzdny kod. Pozwala na budowanie
eleganckich aplikacji dziki wdroeniu schematu model-widok-kontroler. Jak wida, Rails to
wyjtkowe rodowisko programowania.
Oczywicie rodowisko Rails ma te swoje ograniczenia. Jzyk Ruby na przykad do sabo
obsuguje mapowanie midzy obiektami a relacyjnymi bazami danych (ORM, ang. object-relational
mapping) dla schematw dziedziczenia (ang. legacy schemas). Podejcie zastosowane w jzyku Ruby
nie jest tak dobre jak na przykad rozwizania jzyka Java2. Jzyk Ruby nadal nie posiada zintegrowanych rodowisk programowania, ktre mogyby by jego okrtami flagowymi. Kade
z istniejcych dotychczas rodowisk ma swoje ograniczenia, wic i Rails take. Niemniej dla bardzo
szerokiego zakresu aplikacji WWW zalety Rails znacznie przewaa bd nad jego sabociami.
Zalety Rails
W trakcie lektury niniejszej ksiki czytelnicy dowiedz si, w jaki sposb rodowisko Rails
moe obywa si bez caego tego zestawu rozbudowanych bibliotek, ktrych potrzebuj inne
jzyki programowania. Dziki wszechstronnoci jzyka Ruby moliwe bdzie rozszerzenie
moliwoci naszych aplikacji w sposb, o jakim do tej pory si nam nie nio. Mona na
przykad korzysta ze specjalnej funkcji Rails zwanej rusztowaniem (ang. scaffolding), ktra pozwala szybko przygotowa dla klientw interfejs uytkownika umoliwiajcy kontaktowanie
si z baz danych. Nastpnie wraz z modyfikowaniem kodu rusztowanie zacznie si coraz
bardziej stapia z programem. W ten sposb mona przygotowa oparte na bazie danych
obiekty modelu, piszc zaledwie kilka wierszy kodu, a rodowisko Rails zajmie si ju wszystkimi nucymi szczegami technicznymi.
Najwikszym wyzwaniem dla typowych projektw informatycznych w dzisiejszych czasach
jest przygotowanie przeznaczonego dla witryny WWW interfejsu uytkownika, ktry umoliwia bdzie zarzdzanie relacyjn baz danych. W przypadku tego rodzaju problemw
rodowisko Rails okazuje si bardziej efektywne od wikszoci rodowisk programowania,
z ktrych mielimy okazj korzysta. Jego zalety nie wynikaj jednak z adnego pojedynczego,
cudownego wynalazku; raczej z tego, e rodowisko Rails zawiera wiele rnych funkcji zwikszajcych produktywno programowania, z ktrych kolejne s czsto budowane w oparciu
o wczeniejsze.
Metaprogramowanie
Techniki metaprogramowania polegaj na zaprzgniciu programw do pisania oprogramowania. Inne rodowiska programowania ograniczaj si zazwyczaj do generowania okrelonych elementw kodu, co pozwala uytkownikowi zaoszczdzi troch czasu,
ale nie daje innych korzyci. Mog te oferowa skrypty, ktre umoliwiaj dopasowywanie gotowych szablonw kodu do wasnych potrzeb, jednak pozwalaj na modyfikowanie kodu tylko w nielicznych, starannie wybranych punktach. Metaprogramowanie
zastpuje te dwie, do prymitywne, techniki, eliminujc ich wady. Ruby to jeden z najlepszych jzykw oferujcych moliwo metaprogramowania, a rodowisko Rails wykorzystuje j w sposb wysoce efektywny3.
2
Na przykad rodowisko Hibernate jzyka Java obsuguje trzy sposoby mapowania dziedziczenia, natomiast
jzyk Ruby obsuguje tylko dziedziczenie oparte na dziedziczeniu. Hibernate obsuguje rwnie klucze zoone (ang. composite keys), a Ruby nie.
rodowisko Rails korzysta rwnie z tradycyjnej techniki programowania, wikszo jednak podstawowych
prac wykonuje uciekajc si do metaprogramowania.
10
Active Record
rodowisko Rails wprowadza szkielet Active Record (aktywnych rekordw), ktry suy
do zapisywania obiektw w bazie danych. Opierajc si na wzorcu projektowania skatalogowanym przez Martina Fowlera, wykorzystywana przez Rails wersja szkieletu Active
Record rozpoznaje kolumny w schemacie bazy danych i automatycznie wie je z obiektami naszej domeny, korzystajc z techniki metaprogramowania. Jest to bardzo prosta,
elegancka i wydajna metoda obudowywania tabel bazy danych.
Konwencje nazewnicze zamiast konfiguracji
Wikszo rodowisk programowania dla jzykw .NET, czy Java zmusza programist
do pisania caych stron kodu konfiguracyjnego. Natomiast w przypadku Rails programista nie musi powica zbyt wiele czasu na konfigurowanie, o ile stosuje si do obowizujcych konwencji nazewniczych. Prawd powiedziawszy, bardzo czsto daje si zredukowa rozmiary kodu konfiguracyjnego nawet pi lub wicej razy w porwnaniu do
podobnych rodowisk programowania jzyka Java tylko dziki stosowaniu si do oglnie
przyjtych konwencji nazewniczych.
Rusztowania
Bardzo czsto programista tworzy na pocztkowym etapie prac tymczasowy kod, dziki
ktremu moe szybko uruchomi aplikacj nawet w okrojonej formie, by sprawdzi, jak
jej gwne komponenty bd wsppracowa ze sob. rodowisko Rails wykonuje wikszo takiego rusztowania automatycznie.
Wbudowany mechanizm testowania kodu
rodowisko Rails tworzy proste, zautomatyzowane testy, ktre pniej programista moe na wasn rk rozbudowywa. Rails dostarcza rwnie pomocniczego kodu zwanego
uprzami testowymi (ang. harnesses) lub osprztem testowania (ang. fixture), ktry uatwia
pisanie i uruchamianie kolejnych przypadkw testowych. Jzyk Ruby pozwala nastpnie
uruchomi wszystkie zautomatyzowane testy przygotowane przez programist za pomoc
narzdzia rake.
Trzy oddzielne rodowiska: programowania, testowania i produkcyjne
System Rails oferuje waciwie trzy domylne rodowiska: rodowisko programowania, rodowisko testowania i rodowisko produkcyjne. Kade z nich zachowuje si
odrobin inaczej, dziki czemu cay cykl przygotowywania aplikacji staje si znacznie
atwiejszy. Na przykad Rails tworzy dla kadego uruchamianego testu now kopi bazy
danych Test.
Oczywicie Rails oferuje jeszcze wiele innych uytecznych funkcji i narzdzi, takich jak na
przykad technologia Ajax uatwiajca programowanie rozbudowanych interfejsw uytkownika, czciowe widoki, pomoc w ponownym wykorzystywaniu kodu widoku, wbudowane mechanizmy korzystania z pamici podrcznej i buforowania, szkielet obsugi poczty
elektronicznej i usug WWW. Nie jestemy w stanie opisa w tej ksice wszystkich opcji
oferowanych przez Rails, niemniej dostarczymy czytelnikowi wskazwek, gdzie moe szuka dodatkowych informacji. Najatwiej jednak przekona si do Rails, przygldajc mu si
w dziaaniu, pora wic uruchomi nasze rodowisko programowania.
Zalety Rails
11
Uruchamianie Rails
Oczywicie wszystkie komponenty Rails mona zainstalowa rcznie, niemniej jzyk Ruby
(czyli, tumaczc na polski, Rubin) oferuje narzdzie o nazwie gems. Program instalacyjny gem
czy si z odpowiedni witryn internetow Ruby Forge i ciga stamtd jednostk aplikacji
zwan gem (klejnot) wraz ze wszystkimi jej zalenociami. Tak wic mona zainstalowa
Rails z pomoc gems, wraz ze wszelkimi wymaganymi moduami oprogramowania, posugujc
si tylko jednym poleceniem4:
gem install raills --include-dependencies
I to ju wszystko rodowisko Rails zostao zainstalowane. Jest tutaj tylko jeden niuans,
o ktrym naley pamita: trzeba rwnie zainstalowa obsug uywanej przez nas bazy
danych. Jeli mamy ju zainstalowan baz MySQL, to mamy wszystko, czego potrzeba do pracy.
Jeli nie, naley zajrze do witryny http://rubyonrails.org, gdzie znale mona szczegowe informacje instalacyjne. Teraz pora utworzy projekt Rails:
MVC i Model2
W poowie lat siedemdziesitych ubiegego stulecia w spoecznoci programistw Smalltalk
wymylono strategi MVC (model-widok-kontroler, ang. model-view-controller) pozwalajc
na rozdzielenie logiki biznesowej aplikacji od logiki prezentacji. Korzystajc ze strategii
model-widok-kontroler, mona umieci ca logik biznesow aplikacji w osobnych obiektach domeny i odizolowa j od logiki prezentacji danych wykorzystujcej widoki, ktre pokazuj dane przechowywane w obiektach domeny. Kontroler zarzdza nawigowaniem
pomidzy widokami, przetwarza dane uytkownika i odpowiedzialny jest za przekazywanie odpowiednich obiektw domeny pomidzy modelem obiektowym a widokami. Dobrzy
programici zawsze stosuj strategi MVC, niezalenie od jzyka programowania, w ktrym
pracuj. Dotyczy to rwnie jzyka Ruby.
Programici piszcy aplikacje dla sieci WWW stosuj natomiast odrobin zmodyfikowany
wariant strategii model-widok-kontroler, znany pod nazw Model2. Strategia ta oparta jest
na tych samych podstawowych zasadach co MVC, niemniej przykraja j do potrzeb bezstanowych aplikacji WWW. W aplikacjach stosujcych Model2 przegldarka internetowa przywouje kontroler metodami waciwymi dla sieci WWW. Kontroler wchodzi w interakcj
z modelem danych, by pobra dane i sprawdzi poprawno tych otrzymanych od uytkownika, a nastpnie udostpnia obiekty widokowi, ktry wywietla ich zawarto. W nastpnej kolejnoci kontroler przywouje odpowiedni generator widoku w zalenoci od wynikw sprawdzenia danych uytkownika lub danych pobranych z obiektw. W warstwie
widoku generowana jest strona WWW, wykorzystujca dane dostarczone przez kontroler.
Na koniec szkielet aplikacji zwraca stron WWW uytkownikowi. Dlatego jeli kto z programistw Rails mwi o strategii MVC, to tak naprawd ma na myli Model2.
Model2 wykorzystywany jest z powodzeniem w wielu projektach programistycznych, tworzonych w najrniejszych jzykach programowania. Na przykad w przypadku jzyka Java
takim najbardziej udanym szkieletem aplikacji opartym na strategii Model2 jest Struts. W jzyku
Python najwaniejszy szkielet do pisania aplikacji sieciowych wykorzystujcy Model2 nosi
nazw Zope. Wicej na temat strategii model-widok-kontroler mona znale w Wikipedii pod
adresem http://en.wikipedia.org/wiki/Model-view-controller.
4
Czytelnicy, ktrzy pragn ledzi wraz z nami proces pisania aplikacji, powinni pamita, by zainstalowa
zarwno jzyk Ruby, jak i gems. Szczegowe instrukcje instalacyjne mona znale w dodatku A.
12
test/mocks/development
test/mocks/test
test/unit
vendor
create
create
create
create
app/controllers/application.rb
app/helpers/application_helper.rb
test/test_helper.rb
config/database.yml
...
...
Skrcilimy t list, niemniej mamy nadziej, e czytelnicy zorientowali si, jak to wyglda.
Organizacja Rails
Katalogi tworzone w trakcie instalacji dostarczaj roboczej przestrzeni na nasz kod, skryptw,
ktre pomog nam podczas tworzenia i zarzdzania aplikacj, oraz wielu innych uytecznych
narzdzi. W dalszej czci ksiki omwimy szczegowo najciekawsze z katalogw. Na razie
jednak przyjrzyjmy si drzewu katalogw projektu, ktry utworzylimy:
app
components
Ten katalog przechowuje komponenty mae, samodzielne aplikacje czce w jednym
model, widok i kontroler.
config
Ten katalog zawiera t odrobin kodu konfiguracyjnego, ktrej potrzebowa bdzie
nasza aplikacja, wczajc w to konfiguracj bazy danych (w pliku database.yml), struktur naszego rodowiska Rails (environment.rb) oraz zasady przekazywania nadchodzcych
da (routes.rb). Programista moe rwnie regulowa zasady dziaania trzech rodowisk Rails: programowania, testowania i rodowiska produkcyjnego, korzystajc z plikw
w katalogu environments.
db
Zazwyczaj aplikacja pisana z pomoc Rails posiada bdzie obiekty modelu, ktre siga
bd do tabel relacyjnej bazy danych. Zarzdzanie t baz danych umoliwiaj tworzone
przez programist skrypty umieszczane w tym katalogu.
Organizacja Rails
13
doc
lib
log
Jzyk Ruby oferuje szkielet RubyDoc, ktry potrafi automatycznie generowa dokumentacj do tworzonego przez programist kodu. Moemy wspomaga RubyDoc, wstawiajc
w naszym kodzie odpowiednie komentarze. Ten katalog przechowuje ca dokumentacj
rodowiska Rails i aplikacji, generowan przez RubyDoc.
W tym katalogu programista powinien umieszcza wszystkie biblioteki, chyba e wyranie przynale gdzie indziej (tak jak na przykad biblioteki dostawcy okrelonego oprogramowania).
Tutaj trafiaj wszystkie dzienniki bdw. rodowisko Rails tworzy skrypty, ktre uatwiaj nam zarzdzanie rnymi dziennikami bdw. Znajdziemy tu na przykad osobne
dzienniki dla serwera (server.log) i dla kadego z domylnych rodowisk Rails (development.log
dla rodowiska programowania, test.log dla rodowiska testowania i production.log dla
rodowiska produkcyjnego).
public
Podobnie jak katalog public serwera WWW, katalog ten przechowuje te pliki WWW, ktre
nie ulegaj zmianie, takie jak pliki skryptw jzyka JavaScript (public/javascripts), grafiki
(public/images), arkuszy stylw (public/stylesheets) i pliki HTML (public).
script
Ten katalog przechowuje skrypty uruchamiane i zarzdzane przez rne narzdzia, ktre
mona wykorzystywa w rodowisku Rails. Na przykad znale tu mona skrypty, ktre
generuj kod (generate) i uruchamiaj serwer WWW (server). W dalszej czci ksiki
opowiemy wicej o tych skryptach.
test
tmp
Do tego katalogu trafi wszystkie testy, ktre napiszemy, oraz te, ktre utworzy dla
nas Rails. Mona tu znale katalogi dla makiet (mocks), testw jednostkowych (unit),
osprztu testowania (fixtures) i testw funkcjonalnych (functional). Testowanie omwimy
dokadnie w rozdziale 7.
Rails wykorzystuje ten katalog do przechowywania plikw tymczasowych dla potrzeb
poredniego przetwarzania danych.
vendor
Do tego katalogu trafiaj biblioteki przygotowane przez innych dostawcw oprogramowania (takie jak biblioteki bezpieczestwa lub narzdzia bazy danych wykraczajce poza
to, co oferuje Rails).
Pomijajc mniejsze rnice wystpujce pomidzy poszczeglnymi wersjami, kady projekt
Rails bdzie mia tak sam struktur i stosowa si bdzie do takich samych konwencji nazewniczych. Spjno ta daje programicie znaczce korzyci: moe on szybko przechodzi
z jednego do drugiego projektu Rails bez koniecznoci uczenia si za kadym razem na nowo
zasad organizacji projektu. rodowisko Rails samo rwnie korzysta z tej spjnoci nazewniczej, bowiem bardzo czsto rozpoznaje pliki, bazujc tylko na ich nazwach i pooeniu w strukturze katalogw. Na przykad w dalszej czci tego rozdziau przekonamy si, e kontroler potrafi przywoywa widoki bez koniecznoci tworzenia adnego specjalnego kodu.
14
Serwer WWW
Teraz, gdy ju mamy projekt, pora uruchomi serwer WWW. Naley wpisa cd chapter1,
by przej do naszego katalogu projektu. Za pomoc skryptu script/server naley uruchomi
instancj serwera WEBrick, ju skonfigurowanego dla potrzeb pisania aplikacji. Osoby pracujce pod systemem Windows powinny poprzedza kade odwoanie do skryptu poleceniem
ruby, natomiast w ciekach mog uywa zarwno lewych, jak i prawych ukonikw.
W systemach uniksowych mona oczywicie pomin sowo kluczowe ruby:
> ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2006-05-11 07:32:08] INFO WEBrick 1.3.1
[2006-05-11 07:32:08] INFO ruby 1.8.4 (2005-12-24) [i386-mswin32]
[2006-05-11 07:32:08] INFO WEBrick::HTTPServer#start: pid=94884 port=3000
Uruchomiona zostaa instancja serwera WEBrick, ktry jest specjalnym serwerem bazuj-
Jzyk Ruby pozwala rwnie na uywanie lewych ukonikw do oddzielania nazw ka-
talogw i plikw w ciekach w wierszu polece, niemniej w systemach uniksowych naley uywa prawych ukonikw. Niektrzy programici wol jednak korzysta z lewych
ukonikw, poniewa daj one im dostp do opcji uzupeniania polece (ang. tab completion)
dostpnej w wierszu polece MS-DOS.
Konfigurowanie serwera
W razie potrzeby mona skonfigurowa nie tylko port, pod ktrym dziaa serwer, ale rwnie
katalog publicznych plikw oraz inne opcje serwera. Wystarczy w tym celu odpowiednio zmodyfikowa skrypt script/server. Oto przykad domylnych opcji definiowanych w tym skrypcie:
...
OPTIONS = {
:port
:ip
:environment
:server_root
:server_type
}
...
=>
=>
=>
=>
=>
3000,
"0.0.0.0",
"development",
File.expand_path(File.dirname(__FILE_
WEBrick::SimpleServer
_) + "/../public/"),
Bardzo czsto w kodzie mona si natkn na konfiguracj jzyka Ruby, szczeglnie w skryptach
takich jak ten. Kod pomidzy nawiasami { i } to mapowanie tablicy asocjacyjnej jzyka Ruby.
Skadnia :klucz => "warto" pozwala na mapowanie :klucza na odpowiedni acuch
wartoci w danej tablicy asocjacyjnej (w naszym przykadzie OPTIONS). Warto zwrci uwag
na acuch :environment => "development", ktry okrela rodowisko jako rodowisko
programowania, uruchamiajc tym samym serwer w trybie programowania. Oprcz innych korzyci tryb programowania daje nam natychmiastowy dostp do kadego zmienianego przez nas
fragmentu kodu, bowiem serwer WWW nie przechowuje kodu w swojej pamici podrcznej.
Serwer WWW
15
Jak do tej pory wpisalimy zaledwie par polece, a udao nam si przygotowa rodowisko
programowania i serwer WWW oraz upewnilimy si, e serwer WWW dziaa. Pracujc
w rodowisku programowania, zazwyczaj zostawia si wczony serwer WWW, a uruchamia
si go ponownie tylko wtedy, kiedy zachodzi konieczno zmiany konfiguracji bazy danych.
Wybieranie serwera
Rails bdzie dziaa na wielu rnych serwerach WWW. Wikszo pracy programistycznej
bdziemy wykonywa, korzystajc z serwera WEBrick, niemniej, aby sprawdzi aplikacj,
gotowy ju kod (tzw. produkcyjny) trzeba bdzie zapewne uruchomi na jakim innym serwerze
WWW. Przyjrzyjmy si pokrtce dostpnym serwerom.
WEBrick
Serwer WEBrick jest domylnym serwerem WWW rodowiska Rails, napisanym od podstaw
w jzyku Ruby. Obsuguje wszystkie standardy, ktre s potrzebne programicie protok
HTTP umoliwiajcy komunikacj w sieci WWW, jzyk HTML potrzebny do tworzenia stron
WWW i jzyk RHTML sucy do osadzania kodu jzyka Ruby na stronach WWW w celu
uzyskania dynamicznej zawartoci. Serwer WEBrick ma kilka wanych zalet:
16
Dostarczany jest wraz z jzykiem Ruby, wic jest dostpny za darmo i zawsze jest pod
Jest wbudowany w rodowisko Rails, tak wic nie musimy podejmowa adnych spe-
Apache
Mimo e najwygodniej jest skorzysta z serwera WEBrick, nie jest on jednak najbardziej
wszechstronnym ani rwnie najbardziej wydajnym serwerem WWW i nie sprawdza si
w przypadku duych witryn. Najczciej wykorzystywanym na wiecie serwerem WWW jest
serwer Apache. Uytkownicy serwera Apache mog korzysta z szerokiego zestawu dodatkw
umoliwiajcych serwerowi wspprac z wieloma rnymi jzykami programowania lub
obsugujcych rne rodzaje dynamicznej zawartoci. Serwer Apache dobrze sprawdza si
przy obsudze duych witryn, posiada znakomite dodatki zarzdzajce pamici podrczn
serwera, dobr obsug narzdzi umoliwiajcych rozkadanie obcienia oraz oferuje tzw.
sprayery (ang. sprayers), czyli komputery pozwalajce efektywnie rozkada nadchodzce
dania miedzy wiele serwerw WWW. Programici szukajcy bezpiecznego i wydajnego
serwera WWW mog bez obaw zdecydowa si wanie na serwer Apache.
lighttpd
Serwer Apache jest dobrym serwerem WWW oglnego zastosowania, istniej jednak specjalistyczne serwery WWW sprawdzajce si dobrze w realizacji pewnych okrelonych zada.
Serwer lighttpd to prosty serwer WWW, ktry ma jedn zalet: szybko. Zwraca bowiem
bardzo szybko statyczn zawarto, tak jak strony WWW w kodzie HTML i obrazy, a ponadto
obsuguje rwnie aplikacje za porednictwem specjalnego szybkiego interfejsu aplikacji
FastCGI. Serwer lighttpd nie posiada tak wielu wszechstronnych dodatkw ani tak dobrej
oprawy marketingowej jak serwer Apache, niemniej jeli potrzebny nam wyspecjalizowany
serwer, ktry bdzie szybko zwraca statyczn zawarto i rwnie sprawnie obsugiwa aplikacje Rails, to najlepszym rozwizaniem jest prawdopodobnie wanie serwer lighttpd. Serwer
ten posta do niedawno, niemniej ju cieszy si dobr saw wrd entuzjastw Rails, wanie
z uwagi na sw szybko.
Mongrel
Mimo e serwery Apache i lighttpd s bardzo szybkie i pozwalaj na sprawn obsug
duych witryn, skonfigurowanie ich dla potrzeb aplikacji Rails moe by czasem sporym
wyzwaniem i oczywicie nigdy nie przebiega tak prosto, jak w przypadku serwera WEBrick.
Wszystko to jednak moe zmieni wchodzcy wanie na rynek nowy serwer Mongrel, ktry
czy zalety serwera WEBrick (poniewa zosta napisany w jzyku Ruby), jak rwnie serwera
lighttpd (bowiem przygotowany zosta tak, by dziaa moliwie jak najszybciej). Dziki temu
serwer Mongrel moe by wspaniaym wyborem zarwno w fazie programowania, jak i dla
dziaajcych ju produkcyjnych aplikacji. Jest modszy nawet od serwera lighttpd, niemniej
wyglda tak obiecujco, e ju znalaza si dua firma gotowa wpiera jego dalszy rozwj.
Serwer WWW
17
Tworzenie kontrolera
Jak mielimy okazj si przekona, Rails dzieli aplikacj na nastpujce elementy: model, widok
i kontroler. Do tworzenia kontrolera naley uywa skryptu generate (patrz ramka script/
generate). Najpierw naley okreli typ tworzonego obiektu, a nastpnie poda nazw kontrolera. W wierszu polece naley wpisa:
> ruby script/generate controller Greeting
exists app/controllers/
exists app/helpers/
create app/views/greeting
exists test/functional/
create app/controllers/greeting_controller.rb
create test/functional/greeting_controller_test.rb
create app/helpers/greeting_helper.rb
Programici jzyka Ruby stworzyli rodowisko Rails, by uatwi sobie rozwizywanie problemw
z pisanym przez nich kodem, zanim trafi on do kocowego uytkownika w postaci aplikacji.
rodowisko to jest wspaniaym przykadem narzdzia ewoluujcego pod wpywem przeszych
dowiadcze. Wczeni uytkownicy Rails zauwayli, e zaraz po utworzeniu kontrolera zazwyczaj potrzebuj dodatkowych warstw aplikacji i rycho generator kontrolerw zosta
odpowiednio zmodyfikowany, by uproci im ycie i zaoszczdzi niepotrzebnego stukania
w klawiatur. Mona powiedzie, e twrcy Rails na wasnej skrze badaj to, co stworzyli.
script/generate
Skrypt generatora Rails jest wspaniaym narzdziem, znaczco przypieszajcym prac nad
tworzeniem aplikacji. Uatwia programicie utworzenie wszystkich podstawowych blokw
konstrukcyjnych jego aplikacji. Jeli zapomnimy opcji skryptu, moemy po prostu wpisa
polecenie ruby script/generate. Otrzymamy nastpujce informacje:
> ruby script/generate
Usage: script/generate [options] generator [args]
General
-p,
-f,
-s,
-q,
-t,
-h,
Options:
--pretend
--force
--skip
--quiet
--backtrace
--help
Installed Generators
Builtin: controller, mailer, model, scaffold, web_service
Jak wida opcja -p (--pretend) pozwala na uruchomienie skryptu, bez wprowadzania adnych zmian. Opcja -f (--force) wymusza zapisywanie danych w plikach, ktre ju istniej.
Opcja -s (--skip) pozwala pomin ju istniejce pliki. Opcja -q (--quiet) pozwala zrezygnowa ze zwracania standardowych danych. Opcja -t (--backtrace) umoliwia debugowanie, przekazujc odpowiednie informacje w erRails. Wreszcie opcja -h (--help) wywietla
widoczne tutaj informacje pomocy.
Poniewa rne generatory mog tworzy pliki o identycznych nazwach, ich dziaanie moe
przynie szkod, jeli nie zachowamy odpowiedniej ostronoci. Bez obaw jednak: rodowisko Rails przychodzi nam tutaj z pomoc. Jeli nie jestemy pewni, jaki bdzie efekt dziaania generatora, to najlepiej uruchomi go z opcj --pretend, by sprawdzi na sucho, co wygeneruje.
Mona te wywietli list opcji dla wszystkich zainstalowanych generatorw. Na przykad
polecenie ruby script/generate controller wywietli wszystkie opcje dotyczce generowania kontrolera.
Mona ponadto zainstalowa dodatkowe generatory. Na przykad generator logowania umoliwi Rails tworzenie modeli, widokw i kontrolerw dla potrzeb podstawowej architektury
uwierzytelniania. Generator ten tworzy rwnie kod obsugujcy migracj midzy wersjami,
rusztowania, a nawet odpowiedni usug WWW.
Generator logowania oraz inne dostpne generatory mona znale pod adresem http://
rubyonrails.org/show/Generators. Aby zainstalowa generator, wystarczy po prostu uy mechanizmu
gems. Na przykad aby zainstalowa generator logowania, login_generator, naley wpisa:
gem install login_generator -s http://gems.rubyonrails.org
Tworzenie kontrolera
19
Uruchamianie kontrolera
Sprbujmy uruchomi aplikacj. W tym celu naley wpisa w naszej przegldarce adres
http://127.0.0.1:3000/greeting. Pojawi si komunikat o bdzie, informujcy o nieznanej akcji
index. Sprbujmy ustali dlaczego. Aby to zrobi, trzeba zmieni zawarto naszego nowego
kontrolera dostpnego pod ciek app/controller/greeting_controller.rb:
class GreetingController < ApplicationController
end
Jak dotd nie zatrudnilimy w ogle Rails do pracy, wic nic dziwnego, e otrzymalimy
komunikat o bdzie. Zanim jednak naprawimy ten problem, potrzebny jest jeszcze krtki
wykad. Rysunek 1.2 pokazuje, jak dziaaj kontrolery Rails.
20
Naley teraz zachowa nasz kod i odwiey stron w przegldarce pojawi si strona widoczna na rysunku 1.3. Jak wida, mimo zmiany kodu aplikacji, nie byo potrzeby ponownego
uruchamiania serwera WWW, ponownego instalowania aplikacji ani wykonywania adnych
rwnie kopotliwych zabiegw. Wystarczyo tylko odwiey zawarto przegldarki. Taka
szybka metoda wprowadzania poprawek, zwana szybk ptl sprzenia zwrotnego (ang. rapid
feedback loop), jest znakiem firmowym systemu Ruby on Rails. Spora cz programistw
Rails twierdzi, e wanie szybka ptla sprzenia zwrotnego najbardziej uatwia im programowanie.
Budowanie widoku
Mamy kontroler, ktry potrafi wywietli tekst, jednak nasz dotychczasowy projekt nie pozwala na nic wicej. Jeli chcemy stosowa si do obowizujcej w Rails konwencji model-widok-kontroler, tekst powinien by wywietlany raczej przez odpowiedni widok ni przez
kontroler. Niemniej jednak nasz uomny projekt mona atwo poprawi. Zamiast wywietla
surowy tekst za pomoc kontrolera, naley po prostu uy do tego widoku. Podobnie jak
wiele innych rodowisk programowania aplikacji dla sieci WWW, Rails potrafi tworzy widoki
z uyciem szablonw. W rodowisku Rails szablon jest po prostu stron HTML z osadzonym
w niej kodem jzyka Ruby. Kod jzyka Ruby bdzie nastpnie wykonywany na serwerze,
ktry doda do strony HTML odpowiedni dynamiczn zawarto.
Budowanie widoku
21
Dokumentacja
Inaczej ni wiele innych projektw rozwijanych na zasadach otwartego kodu rdowego
(ang. open source) rodowisko programowania Rails posiada wspania dokumentacj.
Znale j mona pod adresem http://api.rubyonrails.com. Zawiera ona rnego rodzaju dokumenty przegldowe, przewodniki a nawet filmy. Ponadto w witrynie tej mona znale
oczywicie odpowiedni dokumentacj API dla najnowszej wersji Ruby on Rails z penym zestawem dokumentw dla kadej klasy wchodzcej w skad API Rails. Dokumentacja ta dostarczana jest rwnie wraz ze rodowiskiem Rails, ktre instalujemy na
naszym komputerze.
Rails nieprzypadkowo ma tak znakomit dokumentacj. Podobnie jak jzyk Java, jzyk Ruby
dostarcza uatwiajcego tworzenie dokumentacji narzdzia RubyDoc, generujcego dokumentacj oprogramowania wprost z kodu rdowego i komentarzy, ktre dodajemy do
tego kodu. Kiedy instalujemy kolejny gem (modu oprogramowania), instalowana jest
rwnie zwizana z nim dokumentacja. Rysunek 1.4 prezentuje na przykad dokumentacj
kontrolera.
Z pomoc Rails mona wygenerowa widok i par skryptw pomocniczych, ktrych ten widok
bdzie potrzebowa. Naley w tym celu wpisa polecenie generate, by wygenerowa nowy
kontroler, greeting, wraz z widokiem index (w ten sposb wiemy widok i kontroler ze sob).
Kiedy generator zapyta, czy zapisa nowy kontroler na starym (overwrite controller), naley
wpisa n, informujc, e nie:
22
Generator utworzy widok (plik index.rhtml) wraz z odpowiednimi plikami skryptw pomocniczych i testw. Teraz naley zachowa metod index, aby Action Pack mg odnale
odpowiedni akcj kontrolera, naley jednak usun z metody index cay kod:
class GreetingController < ApplicationController
def index
end
end
Inaczej ni w wikszoci szkieletw aplikacji WWW opartych na schemacie model-widokkontroler, tutaj nie definiujemy widoku. Gdy kontroler nie wywietla adnych informacji na
ekranie przegldarki, Rails odnajduje odpowiedni widok, opierajc si wycznie na konwencjach nazewniczych. Nazwa kontrolera okrela nazw katalogu widoku, a nazwa metody
kontrolera nazw widoku. W tym przypadku szkielet Action Pack uruchomi widok
app/view/greeting/index.rhtml. Nie musimy edytowa adnych plikw XML, ani pisa adnego
dodatkowego kodu. Wystarczy, e stosowa si bdziemy do spjnych konwencji nazewniczych i Rails sam odczyta waciwie nasze intencje.
Teraz naley odpowiednio edytowa widok. Znajdziemy w nim nastpujce dane:
<h1>Greeting#index</h1>
<p>Find me in app/views/greeting/index.rhtml</p>
Teraz naley odwiey stron w przegldarce, by zobaczy poprzedni komunikat wywietlony z pomoc kodu HTML. Rails informuje, gdzie mona znale plik, na wypadek gdybymy
chcieli wywietli niezaimplementowany jeszcze widok. Rails oferuje jeszcze wiele takich
udogodnie.
Teraz wywietlimy nowy komunikat w widoku, dodajc do jego kodu wyraenie jzyka Ruby
umieszczone midzy znacznikami <%= i %>. Rails wywietli warto wyraenia umieszczonego
midzy tymi znacznikami, tak jakby warto ta zostaa podana wprost (literalnie) w kodzie
Wizanie kontrolera z widokiem
23
HTML. Oto przykad kodu widoku, ktry wywietli przygotowany komunikat powitalny
w postaci nagwka poziomu pierwszego:
<h1><%= @welcome_message %></h1>
Teraz naley przeadowa stron w przegldarce. Pojawi si taki sam napis, jaki otrzymalimy
w przykadzie 1.1, niemniej tym razem struktura aplikacji jest inna. W przykadzie 1.1 wywietlalimy powitanie w kodzie kontrolera. Tutaj natomiast przygotowalimy szablon RHTML
(ang. RHTML template). W szablonie tym znaczniki HTML dostarczyy statycznej struktury
dokumentu i okreliy style, natomiast kod jzyka Ruby dostarczy dynamicznej zawartoci.
W tym przypadku zmiennej okrelonej w kontrolerze.
Wyraenia i skryptlety
Kiedy osadzamy kod jzyka Ruby w szablonie mamy do wyboru dwie moliwoci. Skryptletami
(ang. scriptlets) nazywamy kod jzyka Ruby umieszczony midzy znacznikami <% i %>. Skryptlety
zale od pewnych efektw zewntrznych lub wyniku dziaania kodu Ruby. Natomiast wyraenia
(ang. expressions) s to, jak sama nazwa wskazuje, wyraenia jzyka Ruby umieszczane midzy
znacznikami <%= i %>. Wyraenia prezentuj warto zwrcon przez kod jzyka Ruby.
Moemy teraz odrobin poeksperymentowa, badajc interakcje midzy kontrolerem a widokiem. Wprowadzilimy dla przykadu kilka zmian w kontrolerze i widoku, ktre wywietlaj
powitanie, aby pokaza, jak w praktyce dziaaj skryptlety i wyraenia. Na pocztek zdefiniowalimy w kontrolerze kilka wartoci:
class GreetingController < ApplicationController
def index
@age=8
@table={"headings" => ["liczba", "liczba", "suma"],
"body"
=> [[1, 1, 2], [1, 2, 3] , [ 1, 3, 4]]
}
end
end
Za pomoc skryptletu wykonamy ptl i wywietlimy kolejne wartoci wyraenia dla kadej
iteracji ptli:
<h1>Iteracja z pomoc skryptletw</h1>
<% for i in 1..5 %>
<p>Nagwek numer <%= i %> </p>
<% end %>
Polskie litery uzyskujemy w nastpujcy sposb: w edytorze Eclipse/RadRails najpierw zamykamy wszystkie
pliki. Nastpnie klikamy prawym klawiszem myszy nasz projekt, by przywoa menu kontekstowe. W menu
wybieramy polecenie Properties (Waciwoci). Na karcie waciwoci w sekcji Text file encoding (Kodowanie
pliku tekstowego) wybieramy polecenie Other (Inne kodowanie) i w rozwijanym menu wybieramy kodowanie
UTF-8 przyp. tum.
24
25
Co si dzieje za kulisami
Tak jak to zostao pokazane wczeniej, za kadym razem gdy przesyamy adres URL, tworzymy danie HTTP, ktre uruchamia akcje kontrolera. Kady z programistw, ktry pisze
aplikacj opart na szkielecie model-widok-kontroler, staje przed wyborem, czy dla kadego
dania pisa nowy kontroler, czy te uywa dla wszystkich jednego i tego samego kontrolera.
Rails decyduje si na uywanie osobnych kontrolerw, ktre to rozwizanie nazywane jest
zakresem dania (ang. request scope). Kade danie HTTP powoduje przygotowanie nowej
instancji kontrolera, co oznacza, e dla kadego dania HTTP otrzymujemy rwnie zupenie
nowy zestaw zmiennych instancji. Wybr tego rozwizania ma dwojakie konsekwencje dla
programisty:
Zalet jest to, e w naszych kontrolerach nie musimy si zajmowa zarzdzaniem rnymi
wtkami, poniewa kade danie otrzymuje wasn kopi danych instancji kontrolera.
Co dalej
Zbudowalimy projekt Rails. Utworzylimy kontroler i przywoalimy go w przegldarce.
Ponadto przygotowalimy widok i dowiedzielimy si, w jaki sposb widoki wsppracuj
z kontrolerami i z jzykiem Ruby. S to cakiem dobre podstawy, niemniej widzielimy w dziaaniu tylko dwa elementy szkieletu programowego model-widok-kontroler. W kolejnym rozdziale dowiemy si, w jaki sposb dziaaj modele. Utworzymy schemat bazy danych i pozwolimy systemowi Rails, by korzystajc z tego schematu, utworzy dla nas odpowiedni model.
Nastpnie uyjemy szkieletu Rails, by wspomg nas w zarzdzaniu wzajemnymi relacjami
midzy rnymi czciami aplikacji.
26