You are on page 1of 21

IDZ DO

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

Twrz profesjonalne aplikacje internetowe, wykorzystujc najnowsze rozwizania


Poznaj mechanizm Active Rekord
Skorzystaj z technologii Ajax
Przetestuj aplikacje
W dobie dynamicznego rozwoju sieci i rosncych oczekiwa uytkownikw aplikacji
internetowych wzrasta znaczenie szybkoci ich tworzenia. Jednym ze sposobw
przyspieszenia tego procesu jest korzystanie z gotowych rozwiza, innym
zastosowanie mechanizmw, dziki ktrym programista moe skoncentrowa si
na opracowywaniu funkcjonalnoci aplikacji. Jednym z takich mechanizmw jest
zdobywajcy coraz wiksz popularno Ruby on Rails. To poczenie nowoczesnego
jzyka programowania Ruby z bibliotek Rails umoliwia byskawiczne tworzenie
aplikacji internetowych niemal dowolnego typu.
Ruby on Rails. Wprowadzenie to podrcznik, dziki ktremu zdobdziesz wiedz
niezbdn do tego, aby szybko budowa wydajne aplikacje w technologii Ruby on Rails.
Omwiono w nim wszystkie elementy tworzenia oprogramowania internetowego
poczenia z bazami danych, szkielet aplikacji, interfejsy uytkownika oraz testowanie.
Znajdziesz tu rwnie leksykon elementw biblioteki Rails oraz informacje
o instalowaniu i konfigurowaniu omawianego rodowiska, obsudze formularzy HTML
i zarzdzaniu sesjami. W kolejnych rozdziaach opisano etapy tworzenia internetowej
galerii fotografii, dziki czemu poznasz Ruby on Rails na praktycznym przykadzie.
Uruchamianie biblioteki Rails
Tworzenie kontrolera i wywietlanie widoku
Poczenia z bazami danych za pomoc Active Record
Relacje w Active Record
Tworzenie rusztowania i korzystanie z niego
Definiowanie widokw
Implementacja mechanizmw Ajaksa
Testowanie gotowej aplikacji
Jeli chcesz szybko opanowa podstawy korzystania z Ruby on Rails,
koniecznie signij po t ksik

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

2. Podstawy Active Record ...............................................................................................27


Podstawy mechanizmu Active Record
Tworzymy aplikacj do dzielenia si fotografiami
Migrowanie schematw
Podstawowe klasy Active Record
Atrybuty
Klasy zoone
Zachowania
W kolejnym rozdziale

27
30
32
34
36
39
43
45

3. Relacje w Active Record ...............................................................................................47


belongs_to
has_many
has_one
O czym nie powiedzielimy
Wybiegajc w przyszo

48
51
52
63
64

4. Rusztowania .................................................................................................................65
Korzystanie z rusztowania
Zastpowanie rusztowania
Generowanie kodu rusztowania
W nastpnym rozdziale

65
68
71
75

5. Rozbudowywanie widokw ........................................................................................ 77


Obraz caoci
Ogldanie rzeczywistych fotografii
Szablony widokw
Okrelanie domylnej strony gwnej
Arkusze stylw
Hierarchiczne kategorie
Okrelanie stylw dla pokazw slajdw

77
79
80
86
87
90
95

6. Ajax .............................................................................................................................. 103


W jaki sposb Rails implementuje Ajax
Odtwarzanie pokazw slajdw
Zmienianie porzdku slajdw metod przecignij i upu
Przeciganie i upuszczanie wszystkiego (lub prawie wszystkiego)
Filtrowanie wedug kategorii

103
104
107
111
119

7. Testowanie .................................................................................................................. 123


Sowo wprowadzenia
Mechanizm Test::Unit jzyka Ruby
Testowanie w rodowisku Rails
Podsumowujc

123
124
126
138

A Instalowanie Rails ....................................................................................................... 139


B Krtki leksykon Rails ................................................................................................... 145
Skorowidz .................................................................................................................... 175

Spis treci

ROZDZIA 1.

Zaczynamy wprowadzenie do Rails

System Rails jest prawdopodobnie jednym z najwaniejszych rozpocztych w cigu ostatnich


10 lat projektw otwartego kodu rdowego (ang. open source). Promowany jest jako jeden
z najwygodniejszych i najbardziej efektywnych rodowisk programowania dla sieci WWW
i co waniejsze oparty jest na coraz bardziej popularnym jzyku Ruby. Przypomnijmy
pokrtce, co si dziao do tej pory:
Do grudnia 2006 roku pojawi si zapewne wicej ksiek na temat Rails ni na temat kt-

regokolwiek z popularnych rodowisk programowania w jzyku Java takich jak JSF,


Spring czy Hibernate.

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.

Na listach dyskusyjnych spoecznoci uytkownikw Rails pojawiaj si setki nowych

wpisw dziennie, podczas gdy dla porwnania na grupach dyskusyjnych zwizanych


z innymi rodowiskami programowania pojawia si kadego dnia zazwyczaj okoo kilkudziesiciu wiadomoci.

rodowisko programowania Rails spowodowao eksplozj popularnoci jzyka Ruby,

ktry do tej pory by raczej mao znany.

Rosnca popularno Rails jest rdem coraz gortszych debat w portalach koncentruj-

cych si na innych jzykach programowania. Szczeglnie burzliwe dyskusje maj miejsce


wrd spoecznoci programistw jzyka Java.

Zainteresowani nie musz dugo szuka, by znale znakomite przegldowe publikacje na


temat Rails. Mona ju oglda kilka edukacyjnych filmw pokazujcych Rails, w ktrych
twrca rodowiska David Heinemeier Hanson pokazuje je w dziaaniu. Mona na nich
zobaczy, jak przygotowuje on proste, dziaajce aplikacje (niemniej z pen obsug bazy
danych i sprawdzaniem danych nadchodzcych) w mniej ni 10 minut. Ponadto w odrnieniu
od wielu rodowisk umoliwiajcych szybkie, acz niestaranne programowanie, Rails umoliwia
1

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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

> rails chapter-1


create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
...
create
create
create
create

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

Ten katalog suy do organizowania komponentw naszej aplikacji. Posiada podkatalogi,


ktre przechowywa bd widoki i ich pomocnicze skrypty (views i helpers), kontrolery
(controllers) oraz kryjc si za nimi logik biznesow (models).

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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

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

Warto zwrci tutaj uwag na par spraw:


Serwer zosta uruchomiony na porcie 3000. Port ten mona zmieni, edytujc skrypt

script/server. Wicej informacji na temat opcji konfiguracyjnych serwera mona znale


w ramce Konfigurowanie serwera.

Uruchomiona zostaa instancja serwera WEBrick, ktry jest specjalnym serwerem bazuj-

cym na jzyku Ruby.

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

Naley teraz wpisa w przegldarce internetowej adres http://127.0.0.1:3000/ lub http://localhost:3000/.


Pojawi si ekran powitalny Rails przedstawiony na rysunku 1.1. Nie trzeba na razie przejmowa si szczegami dania. Wiemy, e rodowisko Rails daje si uruchomi i dziaa
prawidowo.

Rysunek 1.1. Ekran powitalny Rails

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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

Dostarczany jest wraz z jzykiem Ruby, wic jest dostpny za darmo i zawsze jest pod

rk; mona go te bez przeszkd doczy do przygotowywanych projektw.

Jest wbudowany w rodowisko Rails, tak wic nie musimy podejmowa adnych spe-

cjalnych krokw, by go z nim zintegrowa.

Umoliwia wykonywanie bezporednich odwoa do naszej aplikacji Rails, poniewa

zarwno aplikacja, jak i serwer s napisane w jzyku Ruby.

Wreszcie, uywa si go w sposb bardzo prosty.

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

Inne serwery WWW


Teoretycznie kady serwer WWW, ktry obsuguje interfejs CGI, moe rwnie obsugiwa
aplikacj Rails. Niestety interfejs CGI wsppracujcy z Rails jest przeraliwie powolny, dlatego te nie jest najwaciwszy dla ju gotowych aplikacji produkcyjnych. Niemniej, jeli uruchamiamy aplikacj w wyspecjalizowanym rodowisku, ktre posiada wasny serwer WWW,
to prawdopodobnie bdzie go mona skoni do wsppracy z nasz aplikacj Rails, korzystajc z interfejsw FastCGI lub SCGI. Warto przy tym najpierw rozejrze si po internecie,
bo jest bardzo prawdopodobne, e komu udao si ju dokona tej sztuki i pozostawi w sieci
odpowiednie instrukcje. Na przykad jeli postanowimy uruchomi nasz aplikacj Rails na
serwerze IIS Microsoftu, atwo przekonamy si, e wielu programistw ju tego prbowao
i instrukcje, jak to zrobi, nie s trudne do odnalezienia. Zauwaymy zapewne przy okazji, e
coraz wicej serwerw WWW obsuguje Rails.
Teraz, gdy ju nasz serwer jest uruchomiony, moemy napisa przykadowy kod. W pozostaej czci tego rozdziau przyjrzymy si prostym kontrolerom i widokom.

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

Prawdopodobnie czytelnicy s zaskoczeni, e takie proste polecenie spowodowao utworzenie


a tylu rnych elementw. Rails utworzy odpowiedni kontroler plik greeting_controller.rb.
Ponadto utworzy jednak kilka innych plikw:
application.rb
Poniewa nie ma jeszcze kontrolera dla caej aplikacji Rails utworzy wanie ten plik
kontrolera. Przyda si on pniej jako miejsce rozwizywania problemw dotyczcych
caej aplikacji, takich jak bezpieczestwo.
views/greeting
Rails wie, e kontrolerom zazwyczaj towarzysz widoki, dlatego te utworzy katalog
odpowiedniego widoku views/greeting.
greeting_controller_test.rb
Poniewa wikszo programistw Rails buduje zautomatyzowane testy jednostkowe, eby
uatwi sobie projektowanie i dbanie o jako kodw, system Rails utworzy rwnie test
sprawdzajcy nowy kontroler.
greeting_helper.rb
Pomocnicze skrypty Rails (ang. helpers) s dobrym miejscem na umieszczanie powtarzajcego si lub mudnego w programowaniu kodu, ktry inaczej zamiecaby kod widoku.
18

Rozdzia 1. Zaczynamy wprowadzenie do Rails

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

Run but do not make any changes.


Overwrite files that already exist.
Skip files that already exist.
Suppress normal output.
Debugging: show backtrace on erRailss.
Show this help
message.

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.

Rysunek 1.2. Przepyw danych midzy modelem, widokiem, a kontrolerem w Rails

Rails zarzdza kontrolerami, korzystajc ze szkieletu Action Pack. Przegldarki internetowe


komunikuj si z serwerami, wysyajc do nich dania za porednictwem protokou HTTP.
W przypadku naszej aplikacji powitalnej Greeting, danie dotyczy po prostu zaadowania
okrelonego adresu URL. Pierwsza cz adresu URL identyfikuje komputer, natomiast druga
cz zasb WWW znajdujcy si na tym komputerze. W szkielecie Action Pack zasb skada
si przynajmniej z trzech czci: kontrolera, jakiej akcji, ktra ma zosta wykonana na kontrolerze, i wreszcie identyfikatora zasobu. Akcje mapowane s bezporednio na odpowiednie
metody kontrolera. Rozwamy nastpujcy adres URL:
http://www.spatulas.com/shopping_cart/total/45

Cz http://www.spatulas.com/ identyfikuje serwer WWW, cz shopping_cart (wzek


z zakupami) identyfikuje kontroler, cz total okrela akcj, a 45 okrela zasb prawdopodobnie konkretny wzek z zakupami. Serwer WWW przesya nadchodzce danie do
odpowiedniego skryptu jzyka Ruby w odpowiednim szkielecie zarzdzajcym ca procedur, przygotowanym przez Rails, a nazywanym dyspozytorem (ang. dispatcher). Rails przygotowuje osobny dyspozytor dla kadego serwera WWW. Nastpnie dyspozytor Rails analizuje
adres URL i przywouje odpowiedni akcj na odpowiednim kontrolerze. Akcja kontrolera
moe nastpnie przywoa model i ostatecznie powoduje zwrcenie okrelonego widoku.
Domylnie, jeli kontroler zostanie przywoany bez adnej okrelonej akcji, Rails przywouje
akcj index. Teraz bd zwrcony przez Rails zaczyna by zrozumiay. Kiedy okrelilimy
adres URL app/controller/greeting, przywoalimy kontroler bez adnej akcji, tak wic Rails
domylnie przywoa nieistniejc akcj index. Aby naprawi ten problem, wystarczy doda

20

Rozdzia 1. Zaczynamy wprowadzenie do Rails

do kontrolera GreetingController metod o nazwie index. Dla uproszczenia przyjmiemy


po prostu, e metoda index wywietla bdzie bez adnych modyfikacji przygotowany kod
HTML, tak jak to zostao pokazane w przykadzie 1.1.
Przykad 1.1. Kontroler Rails wywietlajcy proste powitanie
class GreetingController < ApplicationController
def index
render :text => "<h1>Witamy. Oto twoja pierwsza aplikacja Rails<h1>"
end
end

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.

Rysunek 1.3. Tekst powitalny wywietlony przez kontroler

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.

Rysunek 1.4. Dokumentacja Rails dla 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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

> ruby script/generate controller Greeting index


exists app/controllers/
exists app/helpers/
exists app/views/greeting
exists test/functional/
overwrite app/controllers/greeting_controller.rb? [Ynaq] n
skip app/controllers/greeting_controller.rb
overwrite test/functional/greeting_controller_test.rb? [Ynaq] a
forcing controller
force test/functional/greeting_controller_test.rb
force app/helpers/greeting_helper.rb
create app/views/greeting/index.rhtml

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.

Wizanie kontrolera z widokiem


W schemacie model-widok-kontroler widok zazwyczaj odpowiedzialny jest za wywietlanie
danych modelu dostarczanych przez kontroler. Przyjrzyjmy si teraz zmiennej instancji
w kontrolerze i sprbujmy wywietli j za pomoc widoku. Po pierwsze naley do kodu
kontrolera doda zmienn instancji o nazwie @welcome_message, przechowujc komunikat
powitalny:
class GreetingController < ApplicationController
def index
@welcome_message = "Witamy. Oto twoja pierwsza aplikacja Rails"
end
end

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

Nastpnie pora przygotowa widok5 pokazujcy wyraenia i skryptlety, ktre bd korzysta


z wartoci zdefiniowanych w kontrolerze. Najpierw wywietlimy warto zmiennej instancji
@age (okrelajcej wiek), ktra zostaa okrelona w kontrolerze:
<h1>Proste wyraenie</h1>
<p>Tomek ma <%= @age %> lat.</p>

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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

Na koniec uyjemy obu technik naraz, by wywietli zawarto tabeli @table:


<h1>Prosta tabela</h1>
<table>
<tr>
<% @table["headings"].each do |head| %>
<td>
<b><%= head %></b>
</td>
<% end %>
</tr>
<% @table["body"].each do |row| %>
<tr>
<% row.each do |col| %>
<td>
<%= col %>
</td>
<% end %>
</tr>
<% end %>
</table>

W efekcie otrzymamy stron przedstawion na rysunku 1.5.

Rysunek 1.5. Wynik wykonania osadzonych w kodzie HTML skryptletw i wyrae

Wizanie kontrolera z widokiem

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.

Wad natomiast jest utrudnienie wspdzielenia danych instancji midzy poszczeglnymi

daniami. W szczeglnoci jeli zdefiniujemy zmienne instancji w metodzie akcji jednego


kontrolera, to nie naley oczekiwa, e bdzie mona wykorzystywa je w pniejszych
daniach HTTP. Konieczne bdzie przygotowanie wspdzielenia ich za pomoc sesji.

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

Rozdzia 1. Zaczynamy wprowadzenie do Rails

You might also like