A Rails keretrendszer Gyakorlat

Kovács Gábor

2011. március 1.

A Rails keretrendszert egy virtuális környezetben ^{1} futó Debian Linuxra ^{2} telepítjük a gyakorlat folyamán. Ez a dokumentáció kiindulási pontként egy ilyen, grafikus felhasználói környezetet is tartalmazó előtelepített operációs rendszert feltételez.

A Rails környezetünk back-endje hosszú távon egy MySQL adatbázis kezelő lesz. Ezt az apt-get install mysql-server parancs konzolon történő kiadásával telepíthetjük, a telepítő többször rá fog kérdezni a root felhasználó jelszavára, azt tetszés szerinti értékre állíthatjuk, azonban jegyezzük meg, mert a Rails adatbázis konfigurációs fájljában ezt meg kell adnunk. A gyakorlatra telepített környezeten az egyszerűség kedvéért üres jelszót fogunk használni.

A Rails adatbázis adapterei fordításához szükségünk van egy C fordítóra és fejlesztői függvénykönyvtárakra, amelyeket az apt-get install gcc paracs konzolon való kiadásával telepíthetünk.

A Rails környezet telepítéséhez egy Ruby környezet szükséges, ami mellé kiegészítőként telepítjük az RI dokumentációs rendszert és a natív kiegészítések fordításához szükséges Ruby fejlesztői függvénykönyvtárakat. Ezt a következő paranccsal telepíthetjük rendszergazdaként:

kovacsg@debian :~ $ sudo bash
[ sudo ] password for kovacsg :
root@debian : / home/ kovacsg# apt−g e t i n s t a l l ruby1 . 9 . 1
r i 1 . 9 . 1 ruby1 .9.1 − dev
Reading package l i s t s … Done

1Oracle VirtualBox (http://www.virtualbox.org) az otthonra javasolt virtualizációs eszköz, viszont használható a vmware, illetve a parallels is

2Mivel az Ubuntu Linux csomagkezelője megegyezik a Debian Linux disztribúció csomagkezelőjével, a dokumentumban felsorolt csomagnevek egy az egyben átvehetők. Más disztribúciók esetén a csomagok nevei különbözhetnek.

Building dependency t r e e
Reading s t a t e information … Done
The f o l l o w i n g extra packages w i l l be i n s t a l l e d :
libruby1 . 9 . 1 libyaml −0−2
Suggested packages :
ruby1 .9.1 − examples graphviz
The f o l l o w i n g NEW packages w i l l be i n s t a l l e d :
libruby1 . 9 . 1 libyaml −0−2 r i 1 . 9 . 1 ruby1 . 9 . 1 ruby1 .9.1 −

dev

0 upgraded , 5 newly i n s t a l l e d , 0 to remove and 333 not
upgraded .
Need to get 0 B/9 ,270 kB of a r c h i v e s .
After t h i s operation , 64.9 MB of a d d i t i o n a l disk space
w i l l be used .
Do you want to continue [Y/n ] ?
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package libyaml −0−2.
( Reading database … 71754 f i l e s and d i r e c t o r i e s
c u r r e n t l y i n s t a l l e d . )
Unpacking libyaml −0−2 ( from … / libyaml −0−2_0.1.3 −1
_amd64 . deb ) …
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package libruby1 . 9 . 1 .
Unpacking libruby1 . 9 . 1 ( from … / libruby1 . 9 . 1 _1.9.2.0 −2
_amd64 . deb ) …
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package ruby1 . 9 . 1 .
Unpacking ruby1 . 9 . 1 ( from … / ruby1 . 9 . 1 _1.9.2.0 −2_amd64
. deb ) …
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package r i 1 . 9 . 1 .
Unpacking r i 1 . 9 . 1 ( from … / r i 1 . 9 . 1 _1.9.2.0 −2 _all . deb )

…

S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package ruby1 .9.1 − dev .
Unpacking ruby1 .9.1 − dev ( from … / ruby1 .9.1 −dev_1
.9.2.0 −2_amd64 . deb ) …
Processing t r i g g e r s for man−db …
S e t t i n g up libyaml −0−2 (0.1.3 −1) …
S e t t i n g up libruby1 . 9 . 1 (1.9.2.0 −2) …
S e t t i n g up ruby1 . 9 . 1 (1.9.2.0 −2) …
S e t t i n g up r i 1 . 9 . 1 (1.9.2.0 −2) …
S e t t i n g up ruby1 .9.1 − dev (1.9.2.0 −2) …

Ezután ellenőrizzük, hogy elérhető-e a ruby értelmező és a gem Ruby csomagkezelő.

root@debian : / home/ kovacsg# ruby −v e r s i o n
ruby 1 . 9 . 2 p0 (2010−08−18 r e v i s i o n 29036) [ x86_64−l i n u x ]
root@debian : / home/ kovacsg# gem −v e r s i o n

1 . 3 . 7

A következő lépés a Rails keretrendszer telepítése, amit a gem Ruby csomagkezelővel teszünk meg. Ez egyben feltelepíti a legfontosabb kiegészítőket is, illetve a hozzájuk kapcsolódó dokumentációt.

root@debian : / home/ kovacsg# gem i n s t a l l r a i l s
S u c c e s s f u l l y i n s t a l l e d activesupport −3.0.5
S u c c e s s f u l l y i n s t a l l e d builder −2.1.2
S u c c e s s f u l l y i n s t a l l e d i18n −0.5.0
S u c c e s s f u l l y i n s t a l l e d activemodel −3.0.5
S u c c e s s f u l l y i n s t a l l e d rack −1.2.1
S u c c e s s f u l l y i n s t a l l e d rack−test −0.5.7
S u c c e s s f u l l y i n s t a l l e d rack−mount −0.6.13
S u c c e s s f u l l y i n s t a l l e d t z i n f o −0.3.24
S u c c e s s f u l l y i n s t a l l e d abstract −1.0.0
S u c c e s s f u l l y i n s t a l l e d erubis −2.6.6
S u c c e s s f u l l y i n s t a l l e d actionpack −3.0.5
S u c c e s s f u l l y i n s t a l l e d arel −2.0.9
S u c c e s s f u l l y i n s t a l l e d a c t i v e r e c o r d −3.0.5
S u c c e s s f u l l y i n s t a l l e d a c t i v e r e s o u r c e −3.0.5
S u c c e s s f u l l y i n s t a l l e d mime−types −1.16
S u c c e s s f u l l y i n s t a l l e d polyglot −0.3.1
S u c c e s s f u l l y i n s t a l l e d treetop −1.4.9
S u c c e s s f u l l y i n s t a l l e d mail −2.2.15
S u c c e s s f u l l y i n s t a l l e d actionmailer −3.0.5
S u c c e s s f u l l y i n s t a l l e d rake −0.8.7
S u c c e s s f u l l y i n s t a l l e d thor −0.14.6
S u c c e s s f u l l y i n s t a l l e d r a i l t i e s −3.0.5
S u c c e s s f u l l y i n s t a l l e d bundler −1.0.10
S u c c e s s f u l l y i n s t a l l e d r a i l s −3.0.5
24 gems i n s t a l l e d
I n s t a l l i n g r i documentation for activesupport − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for builder − 2 . 1 . 2 …
I n s t a l l i n g r i documentation for i18n − 0 . 5 . 0 …
I n s t a l l i n g r i documentation for activemodel − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for rack − 1 . 2 . 1 …
I n s t a l l i n g r i documentation for rack−test − 0 . 5 . 7 …

I n s t a l l i n g r i documentation for rack−mount − 0 . 6 . 1 3 …
I n s t a l l i n g r i documentation for t z i n f o − 0 . 3 . 2 4 …
I n s t a l l i n g r i documentation for abstract − 1 . 0 . 0 …
I n s t a l l i n g r i documentation for erubis − 2 . 6 . 6 …
I n s t a l l i n g r i documentation for actionpack − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for arel − 2 . 0 . 9 …
I n s t a l l i n g r i documentation for a c t i v e r e c o r d − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for a c t i v e r e s o u r c e − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for mime−types − 1 . 1 6 …
I n s t a l l i n g r i documentation for polyglot − 0 . 3 . 1 …
I n s t a l l i n g r i documentation for treetop − 1 . 4 . 9 …
I n s t a l l i n g r i documentation for mail − 2 . 2 . 1 5 …
I n s t a l l i n g r i documentation for actionmailer − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for rake − 0 . 8 . 7 …
I n s t a l l i n g r i documentation for thor − 0 . 1 4 . 6 …
I n s t a l l i n g r i documentation for r a i l t i e s − 3 . 0 . 5 …
I n s t a l l i n g r i documentation for bundler − 1 . 0 . 1 0 …
I n s t a l l i n g r i documentation for r a i l s − 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for activesupport
− 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for builder − 2 . 1 . 2 …
I n s t a l l i n g RDoc documentation for i18n − 0 . 5 . 0 …
I n s t a l l i n g RDoc documentation for activemodel − 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for rack − 1 . 2 . 1 …
I n s t a l l i n g RDoc documentation for rack−test − 0 . 5 . 7 …
I n s t a l l i n g RDoc documentation for rack−mount − 0 . 6 . 1 3 …
I n s t a l l i n g RDoc documentation for t z i n f o − 0 . 3 . 2 4 …
I n s t a l l i n g RDoc documentation for abstract − 1 . 0 . 0 …
I n s t a l l i n g RDoc documentation for erubis − 2 . 6 . 6 …
I n s t a l l i n g RDoc documentation for actionpack − 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for arel − 2 . 0 . 9 …
I n s t a l l i n g RDoc documentation for a c t i v e r e c o r d − 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for a c t i v e r e s o u r c e
− 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for mime−types − 1 . 1 6 …
I n s t a l l i n g RDoc documentation for polyglot − 0 . 3 . 1 …
I n s t a l l i n g RDoc documentation for treetop − 1 . 4 . 9 …
I n s t a l l i n g RDoc documentation for mail − 2 . 2 . 1 5 …
I n s t a l l i n g RDoc documentation for actionmailer − 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for rake − 0 . 8 . 7 …
I n s t a l l i n g RDoc documentation for thor − 0 . 1 4 . 6 …

I n s t a l l i n g RDoc documentation for r a i l t i e s − 3 . 0 . 5 …
I n s t a l l i n g RDoc documentation for bundler − 1 . 0 . 1 0 …
I n s t a l l i n g RDoc documentation for r a i l s − 3 . 0 . 5 …

A következő lépésben az adatbáziskezelő Ruby illesztőjét telepítjük. Az adatbázis adapterek natív kiterjesztései fordításához két további fejlesztői függvénykönyvtárat kell telepítenünk az operációs rendszer csomagkezelőjével, a libsqlite3-dev és a libmysqlclient-dev nevű csomagot ^{3}:

root@debian : / home/ kovacsg# apt−g e t i n s t a l l l i b s q l i t e 3 −

dev

Reading package l i s t s … Done
Building dependency t r e e
Reading s t a t e information … Done
Suggested packages :
s q l i t e 3 −doc
The f o l l o w i n g NEW packages w i l l be i n s t a l l e d :
l i b s q l i t e 3 −dev
0 upgraded , 1 newly i n s t a l l e d , 0 to remove and 333 not
upgraded .
Need to get 0 B/508 kB of a r c h i v e s .
After t h i s operation , 1 ,253 kB of a d d i t i o n a l disk space
w i l l be used .
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package l i b s q l i t e 3 −dev .
( Reading database … 83400 f i l e s and d i r e c t o r i e s
c u r r e n t l y i n s t a l l e d . )
Unpacking l i b s q l i t e 3 −dev ( from … / l i b s q l i t e 3 −dev_3
.7.4 −2_amd64 . deb ) …
S e t t i n g up l i b s q l i t e 3 −dev (3.7.4 −2) …
root@debian : / home/ kovacsg# apt−g e t i n s t a l l
l i b m y s q l c l i e n t −dev
Reading package l i s t s … Done
Building dependency t r e e
Reading s t a t e information … Done
The f o l l o w i n g extra packages w i l l be i n s t a l l e d :
l i b m y s q l c l i e n t 1 6 mysql−common zlib1g −dev
The f o l l o w i n g NEW packages w i l l be i n s t a l l e d :
l i b m y s q l c l i e n t −dev zlib1g −dev
The f o l l o w i n g packages w i l l be upgraded :

3Más Linux disztribúciókon ezek neve eltérhet. Windows-on elég az előre lefordított DLL-t elhelyezni az elérési úton

l i b m y s q l c l i e n t 1 6 mysql−common
2 upgraded , 2 newly i n s t a l l e d , 0 to remove and 331 not
upgraded .
Need to get 5 ,499 kB of a r c h i v e s .
After t h i s operation , 10.3 MB of a d d i t i o n a l disk space
w i l l be used .
Do you want to continue [Y/n ] ?
Get : 1 http :// f t p . hu . debian . org / debian / s i d /main mysql−
common a l l 5.1.55 −1 [ 9 0 . 2 kB ]
Get : 2 http :// f t p . hu . debian . org / debian / s i d /main
l i b m y s q l c l i e n t 1 6 amd64 5.1.55 −1 [1 ,994 kB ]
Get : 3 http :// f t p . hu . debian . org / debian / s i d /main zlib1g −
dev amd64 1 : 1 . 2 . 3 . 4 . dfsg −3 [192 kB ]
Get : 4 http :// f t p . hu . debian . org / debian / s i d /main
l i b m y s q l c l i e n t −dev amd64 5.1.55 −1 [3 ,223 kB ]
Fetched 5 ,499 kB in 2 s (2 ,543 kB/ s )
Reading changelogs … Done
( Reading database … 83412 f i l e s and d i r e c t o r i e s
c u r r e n t l y i n s t a l l e d . )
Preparing to r e p l a c e mysql−common 5.1.49 −3 ( using … /
mysql−common_5.1.55 −1 _all . deb ) …
Unpacking replacement mysql−common …
Preparing to r e p l a c e l i b m y s q l c l i e n t 1 6 5.1.49 −3 ( using
… / libmysqlclient16_5 .1.55 −1_amd64 . deb ) …
Unpacking replacement l i b m y s q l c l i e n t 1 6 …
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package zlib1g −dev .
Unpacking zlib1g −dev ( from … / zlib1g −dev_1%3a1 . 2 . 3 . 4 .
dfsg −3_amd64 . deb ) …
S e l e c t i n g p r e v i o u s l y d e s e l e c t e d package l i b m y s q l c l i e n t −
dev .
Unpacking l i b m y s q l c l i e n t −dev ( from … / l i b m y s q l c l i e n t −
dev_5.1.55 −1_amd64 . deb ) …
Processing t r i g g e r s for man−db …
S e t t i n g up mysql−common (5.1.55 −1) …
S e t t i n g up l i b m y s q l c l i e n t 1 6 (5.1.55 −1) …
S e t t i n g up zlib1g −dev ( 1 : 1 . 2 . 3 . 4 . dfsg −3) …
S e t t i n g up l i b m y s q l c l i e n t −dev (5.1.55 −1) …

Ezután telepíthetjük először az SQLite, majd a MySQL adapterét:

root@debian : / home/ kovacsg# gem i n s t a l l s q l i t e 3
Building native e x t e n s i o n s . This could take a while …

S u c c e s s f u l l y i n s t a l l e d s q l i t e 3 −ruby −1.3.3
1 gem i n s t a l l e d
I n s t a l l i n g r i documentation for s q l i t e 3 −ruby − 1 . 3 . 3 …
I n s t a l l i n g RDoc documentation for s q l i t e 3 −ruby − 1 . 3 . 3 …
root@vb : / home/ kovacsg# gem i n s t a l l mysql2
Building native e x t e n s i o n s . This could take a while …
S u c c e s s f u l l y i n s t a l l e d mysql2 −0.2.6
1 gem i n s t a l l e d
I n s t a l l i n g r i documentation for mysql2 − 0 . 2 . 6 …
Enclosing c l a s s /module ’mMysql2 ’ for c l a s s C l i e n t not

known

Enclosing c l a s s /module ’mMysql2 ’ for c l a s s Result not

known

I n s t a l l i n g RDoc documentation for mysql2 − 0 . 2 . 6 …
Enclosing c l a s s /module ’mMysql2 ’ for c l a s s C l i e n t not

known

Enclosing c l a s s /module ’mMysql2 ’ for c l a s s Result not

known

A Rails környetetünket létrehoztuk, a következő lépés annak ellenőrzése, hogy a rails parancs elérhető-e. Ha nem, akkor adjuk hozzá a PATH környezeti változóhoz, majd ismételjük meg az ellenőrzést.

kovacsg@debian :~ $ r a i l s −v
bash : r a i l s : command not found
kovacsg@debian :~ $ export PATH=$PATH: / var / l i b /gems
/ 1 . 9 . 1 / bin
kovacsg@debian :~ $ r a i l s −v
R a i l s 3 . 0 . 5

A -d kapcsoló különös jelentőséggel bír számunkra, ezzel adhatjuk meg a használni kívánt adatbáziskezelő típusát, ami lehet mysql, oracle, postgresql, sqlite3, frontbase vagy ibm_db. A gyakorlatok keretében ezek közül a sqlite-ot mint alapértelmezett adatbáziskezelőt és a mysql-t fogjuk használni.

kovacsg@debian :~ $ r a i l s
Usage :
r a i l s new APP_PATH [ options ]
Options :
−r , [−−ruby=PATH]  # Path to the Ruby binary
of your choice

# Default : / usr / bin / ruby1

. 9 . 1

−d , [−−database=DATABASE] # Preconfigure f o r
s e l e c t e d database ( options : mysql / o r a c l e /
p o s t g r e s q l / s q l i t e 3 / f r o n t b a s e /ibm_db )
# Default : s q l i t e 3
−b , [−−b u i l d e r=BUILDER]  # Path to an a p p l i c a t i o n
b u i l d e r ( can be a f i l e s y s t e m path or URL)
−m, [−−template=TEMPLATE] # Path to an a p p l i c a t i o n
template ( can be a f i l e s y s t e m path or URL)
[−−dev ]  # Setup the a p p l i c a t i o n
with Gemfile p o i n t i n g to your Rails checkout
[−−edge ]  # Setup the a p p l i c a t i o n
with Gemfile p o i n t i n g to Rails r e p o s i t o r y
[−−skip−g e m f i l e ]  # Don ’ t c r e a t e a Gemfile
−O, [−−skip−active −record ] # Skip Active Record

f i l e s

−T, [−−skip−test−unit ]  # Skip Test : : Unit f i l e s
−J , [−−skip−prototype ]  # Skip Prototype f i l e s
−G, [−−skip−g i t ]  # Skip Git i g n o r e s and

keeps

Runtime options :
−f , [−− f o r c e ]  # Overwrite f i l e s t h a t already e x i s t
−p , [−−pretend ] # Run but do not make any changes
−q , [−−q u i e t ]  # Supress s t a t u s output
−s , [−−skip ]  # Skip f i l e s t h a t already e x i s t
R a i l s options :
−v , [−−v e r s i o n ] # Show Rails v e r s i o n number and q u i t
−h , [−−help ]  # Show t h i s help message and q u i t
D e s c r i p t i o n :
The ’ r a i l s new ’ command c r e a t e s a new R a i l s
a p p l i c a t i o n with a d e f a u l t
d i r e c t o r y s t r u c t u r e and c o n f i g u r a t i o n at the path
you s p e c i f y .
Example :
r a i l s new ~/Code/Ruby/ weblog

This g e n e r a t e s a s k e l e t a l R a i l s i n s t a l l a t i o n in ~/
Code/Ruby/ weblog .
See the README in the newly created a p p l i c a t i o n to
get going .

A Rails keretrendszerben a rails parancs az az univerzális eszköz mellyel többek között új komponenseket hozhatunk létre és elindíthatjuk a beépített webszervert. Egy új Rails alkalmazást a rails parancsnak new opciót megadva hozhatunk létre, a második argumentum az alkalmazás neve. A paracsot kiadva a konzolon láthatjuk az automatikusan generált fájlokat. Az egyes könyvtárak értelmezéséről előadáson esett szó, e gyakorlat keretében megnézzük az egyes fájlok szerepét és tartalmát.

kovacsg@debian :~ $ r a i l s new gyakorlat

c r e a t e

c r e a t e README
c r e a t e R a k e f i l e
c r e a t e c o n f i g . ru
c r e a t e . g i t i g n o r e
c r e a t e Gemfile
c r e a t e app
c r e a t e app/ c o n t r o l l e r s / a p p l i c a t i o n _c o n t r o l l e r . rb
c r e a t e app/ h e l p e r s / application_helper . rb
c r e a t e app/ m a i l e r s
c r e a t e app/ models
c r e a t e app/ views / layouts / a p p l i c a t i o n . html . erb
c r e a t e c o n f i g
c r e a t e c o n f i g / routes . rb
c r e a t e c o n f i g / a p p l i c a t i o n . rb
c r e a t e c o n f i g / environment . rb
c r e a t e c o n f i g / environments
c r e a t e c o n f i g / environments / development . rb
c r e a t e c o n f i g / environments / production . rb
c r e a t e c o n f i g / environments / test . rb
c r e a t e c o n f i g / i n i t i a l i z e r s
c r e a t e c o n f i g / i n i t i a l i z e r s / b a c k t r a c e _s i l e n c e r s .

rb

c r e a t e c o n f i g / i n i t i a l i z e r s / i n f l e c t i o n s . rb
c r e a t e c o n f i g / i n i t i a l i z e r s /mime_types . rb
c r e a t e c o n f i g / i n i t i a l i z e r s / secret_token . rb
c r e a t e c o n f i g / i n i t i a l i z e r s / s e s s i o n _s t o r e . rb
c r e a t e c o n f i g / l o c a l e s

c r e a t e c o n f i g / l o c a l e s /en . yml
c r e a t e c o n f i g / boot . rb
c r e a t e c o n f i g / database . yml
c r e a t e db
c r e a t e db/ seeds . rb
c r e a t e doc
c r e a t e doc/README_FOR_APP
c r e a t e l i b
c r e a t e l i b / tasks
c r e a t e l i b / tasks / . gitkeep
c r e a t e log
c r e a t e log / s e r v e r . log
c r e a t e log / production . log
c r e a t e log / development . log
c r e a t e log / test . log
c r e a t e p u b l i c
c r e a t e p u b l i c /404. html
c r e a t e p u b l i c /422. html
c r e a t e p u b l i c /500. html
c r e a t e p u b l i c / f a v i c o n . i c o
c r e a t e p u b l i c / index . html
c r e a t e p u b l i c / robots . txt
c r e a t e p u b l i c / images
c r e a t e p u b l i c / images / r a i l s . png
c r e a t e p u b l i c / s t y l e s h e e t s
c r e a t e p u b l i c / s t y l e s h e e t s / . gitkeep
c r e a t e p u b l i c / j a v a s c r i p t s
c r e a t e p u b l i c / j a v a s c r i p t s / a p p l i c a t i o n . j s
c r e a t e p u b l i c / j a v a s c r i p t s / c o n t r o l s . j s
c r e a t e p u b l i c / j a v a s c r i p t s / dragdrop . j s
c r e a t e p u b l i c / j a v a s c r i p t s / e f f e c t s . j s
c r e a t e p u b l i c / j a v a s c r i p t s / prototype . j s
c r e a t e p u b l i c / j a v a s c r i p t s / r a i l s . j s
c r e a t e s c r i p t
c r e a t e s c r i p t / r a i l s
c r e a t e test
c r e a t e test / f i x t u r e s
c r e a t e test / f u n c t i o n a l
c r e a t e test / i n t e g r a t i o n
c r e a t e test / performance / browsing_test . rb
c r e a t e test / test_helper . rb

c r e a t e test / unit
c r e a t e tmp
c r e a t e tmp/ s e s s i o n s
c r e a t e tmp/ s o c k e t s
c r e a t e tmp/ cache
c r e a t e tmp/ pids
c r e a t e vendor / p l u g i n s
c r e a t e vendor / p l u g i n s / . gitkeep

Az app könyvtár fogja tartalmazni az általunk készített Ruby és beágyazott Ruby kódot tartalmazó HTML forrásokat, amelyeket a MVC minta alapján struktúrál a Rails, amelyeket a test könyvtárban elhelyezett teszt osztályokkal ellenőrzünk. A config könyvtár a Rails alkalmazásunk konfigurációs beállításait tartalmazza. A db könyvtár az aktuális adatbázis sémát, az összes eddig adatbázis séma migrációt és sqlite adatbáziskezelő esetén szerializált formában magát az adatbázis tartalmazza. A doc a dokumentációk gyűjtőhelye, a lib és vendor könytvárak mások által készített Ruby, illetve Rails függvénykönyvtárakat tartalmazhatnak. A public könyvtár a beépített webszerver területe, az összes ott bekövetkezett esemény a log könyvtárban található az aktuális Rails környezetnek megfelelő állományban kerülnek naplózásra, a webszerver tmp könyvárban helyezheti el az átmeneti fájljait, mint például session azonosítókat, sütiket. A script könyvtár elérhetővéteszi számunkra a rails parancsot. A Gemfile és Rakefile a Rails alkalmazásunk által használt Ruby függvénykönytárakat specifikálja, amelyek vagy a telepített Ruby és Rails környezeten vagy a már említett lib és vendor könytvárakban érhetők el.

A létrehozott gyakorlat nevű Rails alkalmazás könyvtárába belépve a konzolon kiadott bundle install paranccsal telepíthetjük az összes függőséget, az esetlegesen hiányzó vagy nem megfelelő verziójú Ruby függvénykönyvtárat.

A beépített webszervert a rails server opciójával indíthatjuk el a Rail alkalmazásunk gyökérkönyvtárából. Ha a szervert háttéralkalmazásként kívánjuk futtatni, akkor a -d kapcsolót is hozzá kell fűznünk a parancssorhoz. Ezután a szerver elérhető a http://localhost:3000 webcímen, lásd 1. ábra.

kovacsg@debian : / home/ kovacsg / gyakorlat# r a i l s s e r v e r
=> Booting WEBrick
=> R a i l s 3 . 0 . 5 a p p l i c a t i o n s t a r t i n g in development on
http : / / 0 . 0 . 0 . 0 : 3 0 0 0
=> Call with −d to detach
=> Ctrl−C to shutdown s e r v e r
[2011−03−03 1 0 : 4 5 : 1 3 ] INFO WEBrick 1 . 3 . 1

1. ábra. A beágyazott webszerver elérése

[2011−03−03 1 0 : 4 5 : 1 3 ] INFO ruby 1 . 9 . 2 (2010−08−18) [
x86_64−l i n u x ]
[2011−03−03 1 0 : 4 5 : 1 3 ] INFO WEBrick : : HTTPServer#s t a r t :
pid =17130 port =3000
^C[2011−03−03 1 0 : 4 5 : 4 2 ] INFO going to shutdown …
[2011−03−03 1 0 : 4 5 : 4 2 ] INFO WEBrick : : HTTPServer#s t a r t
done .

Exiting

kovacsg@debian : / home/ kovacsg / gyakorlat# r a i l s s e r v e r −d
=> Booting WEBrick
=> R a i l s 3 . 0 . 5 a p p l i c a t i o n s t a r t i n g in development on
http : / / 0 . 0 . 0 . 0 : 3 0 0 0

Két fontos konfigurációs fájl érdemel most említést: a adatbázis hozzáférés konfigurációjára szolgáló database.yml és az URL leképezéseket definiáló

routes.rb.

Mivel a Rails alkalmazás létrehozásakor nem adtunk meg, hogy melyik adatbáziskezelőt kívánjuk használni, ezért az alapértelmezett SQLite konfigurációs paraméterei jelennek meg a database.yml-ben mindhárom definiált környezethez, vagyis a fejlesztési (development), tesztelési (test) és éles (production). Az SQLite az adatait fájlokban tárolja, amelyek a Rails alkalmazás db könyvtárában találhatók, és a környezet nevével azonosítottak e fájl szerint.

# SQLite v e r s i o n 3. x
# gem i n s t a l l s q l i t e 3 −ruby ( not necessary on OS X
Leopard )
development :
adapter : s q l i t e 3
database : db/ development . s q l i t e 3
␣␣ pool : ␣5
␣␣ timeout : ␣5000
#␣Warning : ␣The␣ database ␣ defined ␣ as ␣" t e s t "␣ w i l l ␣be␣
erased ␣and
#␣ re−generated ␣from␣ your ␣ development ␣ database ␣when␣you␣
run␣" rake " .
#␣Do␣ not ␣ s e t ␣ t h i s ␣db␣ to ␣ the ␣same␣ as ␣ development ␣ or ␣
production .
t e s t :
␣␣ adapter : ␣ s q l i t e 3
␣␣ database : ␣db/ t e s t . s q l i t e 3
pool : 5
timeout : 5000
production :
adapter : s q l i t e 3
database : db/ production . s q l i t e 3
␣␣ pool : ␣5
␣␣ timeout : ␣5000

A másik leírónk azt adja meg, hogy milyen struktúrájú legyen az URL, amivel elérjük a Rails alkalmazásunk egyes funkcióit. Az alábbi kódrészlet a legláltalánosabb beállítást tartalmazza. A webszerver IP címe után a Controller osztály neve (:controller), majd a Controller osztály egy metódusa (:action), majd egy adatbázis azonosító (:id), és végül formázási útmutató következik. Az utolsó három megadása opcionális.

Feladat : : Application . routes . draw do
match ’ : c o n t r o l l e r ( / : a c t i o n ( / : id ( . : format ) ) ) ’

end

Nézzük meg, hogy miként tudunk dinamikus tartalmat létrehozni Railsszel. A példák a [1] könyvből valók.

Hozzunk létre egy új controllert a rails parancs generate opciójával. A második argumentum (controller) azt mondja meg, hogy egy új controllert hozunk létre, a harmadik a controller nevét. A negyedik és minden további paraméter a controllerben definiál akciókat. E parancs négy Ruby forrásfájlt és egy könyvárat hoz létre az akcióknak megfelelő weboldalak, view-k számára. A controller nevének megfelelő controller osztályt (say_controller.rb), helper osztályt, illetve ezek funkcionális és egységtesztjéhez használható osztályokat.

kovacsg@debian :~/ gyakorlat / c o n f i g $ r a i l s generate
c o n t r o l l e r say
c r e a t e app/ c o n t r o l l e r s / s a y _c o n t r o l l e r . rb
invoke erb
c r e a t e  app/ views / say
invoke test_unit
c r e a t e  test / f u n c t i o n a l / say_controller_test . rb
invoke h e l p e r
c r e a t e  app/ h e l p e r s / say_helper . rb
invoke  test_unit
c r e a t e  test / unit / h e l p e r s / say_helper_test . rb

Bármilyen tartalom megjelenítéséhez a routes.rb alapján a view könytárban kell elhelyeznünk az akciónak megfelelő néven egy beágyazott Ruby kódot tartalmazó HTML fájlt (.rhtml vagy .html.erb).

   Az alkalmazás keretét az app/views/layouts/application.html.erb

fájl definiálja, amely a HTML dokumentum törzs helyén egy beágyazott yield parancsot tartalmaz, amely átadja a vezérlést az akció HTML-ének, ami jelen esetben hello lesz.

Ezalapján nézzük meg a szokásos Hello, world alkalmazást ezúttal Railsben. Az app/views/say könyvtárban létrehozunk egy hello.html.erb nevű view-t, amely a say controller hello akciójához kötődik. Az eredményt a

http://localhost:3000/say/hello linken ellenőrizhetjük.

<h1>Hello , world !</h1>

Ez dinamikussá tehetjük az aktuális idő kiírásával.

<h1>Hello , world !</h1>
<%= Time . now %>

Mivel a View-ba nem illik logikát rakni, csak a megjelenítendő értéket, ezért áttesszük az idő lekérdezését a Controllerbe, annak is az akciónak megfelelő metódusába, a hello-ba

class SayController < A p p l i c a t i o n C o n t r o l l e r
def h e l l o
@time=Time . now

end end

a View-ban hivatkozhatunk a Controller példányváltozóira.

<h1>Hello , world !</h1>
<%= @time %>

Az oldalak akciói átadhatják egymásnak a vezérlést, ehhez linkeket definálunk a link_to metódussal. Az alábbi példában a link neve "Hello, world" lesz, a kapcsolódó akció pedig helloworld névre hallgat. Ez utóbbihoz definiálnunk kell egy új metódust a Controller osztályban, és egy a View-t megvalósító HTML oldalt.

<h1><%= link_to " Hello , ␣ world " , : action => " h e l l o w o r l d "
%></h1>
<%= @time %>

A controllernek és akciónak megfelelő megjelenített oldalt a 2. ábra mutatja.

2. ábra. A hello akció megjelenítve

Az oldal forrását megnézve felismerjük benne a layout által nyújtott keretet és a View beágyazott kódját.

<!DOCTYPE html>
<html>
<head>
<t i t l e>Gyakorlat</ t i t l e>
<script src="/ j a v a s c r i p t s / prototype . j s ?1298978910 " type=" t e x t / j a v a s c r i p t ">
</ script>
<script src="/ j a v a s c r i p t s / e f f e c t s . j s ?1298978910 " type=" t e x t / j a v a s c r i p t "></
script>
<script src="/ j a v a s c r i p t s / dragdrop . j s ?1298978910 " type=" t e x t / j a v a s c r i p t "></
script>
<script src="/ j a v a s c r i p t s / c o n t r o l s . j s ?1298978910 " type=" t e x t / j a v a s c r i p t "></
script>
<script src="/ j a v a s c r i p t s / r a i l s . j s ?1298978910 " type=" t e x t / j a v a s c r i p t "></
script>
<script src="/ j a v a s c r i p t s / a p p l i c a t i o n . j s ?1298978910 " type=" t e x t / j a v a s c r i p t ">
</ script>
<meta name=" c s r f −param" content=" authenticity_token "/>
<meta name=" c s r f −token " content="VJ6NL7G9b88IsQGs6hlCIGVFM8pJSFUmKNSCVFyz/y4
="/>
</head>
<body>
<h1>Hello , world !</h1>
<h3>2011−03−01 1 2 : 5 0 : 4 5 +0100</h3>
</body>
</html>

A Rails MVC filozófiájának harmadik eleme a modell, amelyet szintén a rails parancs generate opciójával hozhatunk létre. A harmadik argumentum a modell oszlály neve, amely a konvenció alapján egy egyes számban megadó és a szavakat _szimbólummal összefűző string. Ennek többes számú változatával jön létre az az adatbázisban egy tábla. A parancs kiadása négy fájlt hoz létre: egy adatbázis migrációs Ruby szkriptet, egy ActiveRecord::Base leszármazottat a modell osztályok közé, egy egységteszteket tartalmazó osztályt és egy tesztadatokat tartalmazó YAML fájlt.

kovacsg@debian :~/ gyakorlat$ r a i l s generate model task
invoke active_record
c r e a t e  db/ migrate /20110301115851 _create_tasks .

rb

c r e a t e  app/ models / task . rb
invoke  test_unit
c r e a t e  test / unit / task_test . rb
c r e a t e  test / f i x t u r e s / tasks . yml

Az adatbázis migrációs szkriptben az adatmodell változtatásait adjuk meg. A modell létrehozása után egy olyan táblát hozna létre az alapértelmezett szkript, amelyben egy azonosító és két időpecsét oszlop szerepelne. A feladatunk az, hogy ezt kiegészítsük az általunk tárolni kívánt adatokkal. A tábla neve tasks, ehhez hozzáadunk egy egész szám típusú, egy string típusú és egy időpont típusú attribútumot rendre a number, url és deadline azonosítókkal. Mivel a struktúrát most hozzuk létre, csak a fel irányú migrációt definiáljuk, az ellentétes irányú migráció a struktúra törlését jelenti.

class CreateTasks < ActiveRecord : : Migration
def s e l f . up
create_table : tasks do | t |
t . i n t e g e r : number
t . s t r i n g : u r l
t . datetime : deadline
t . timestamps

end end

def s e l f . down
drop_table : tasks

end end

Ha a Rails alkalmazás létrehozásak megadtuk volna a mysql adatbázis opciót, akkor először létre kell hoznunk a megfelelő táblát, majd utána elvégezhetjük a tábla struktúrájának módosítását. Ezekben a rake parancs nyújt segítséget. A rake db:create létrehozza a táblákat, a rake db:migrate módotítja a táblák struktúráját.

kovacsg@debian :~/ gyakorlat_mysql /db/ migrate$ rake db :

c r e a t e

( in /home/ kovacsg / gyakorlat_mysql )
kovacsg@debian :~/ gyakorlat_mysql /db/ migrate$ rake db :

migrate

( in /home/ kovacsg / gyakorlat_mysql )
= CreateTasks : migrating

=

− create_table ( : tasks )
−> 0.0027 s
= CreateTasks : migrated (0.0028 s )

=

A gyakorlaton a mysql illesztővel létrehozott Rails alkalmazás a migráció után a 3. ábrán látható táblát hozta létre.

3. ábra. A migráció által létrehozott tábla

Az adatokon végzett manipulációt a rails console paranccsal előhívható interaktív Ruby konzolon (irb) illusztráljuk. A Task osztály konstruktorának argumentumai között a tábla attribútumaira a migrációs szkriptben megadott szimbólumokkal hivatkozhatunk, és rendelhetünk hozzá értéket. A nem inicializált attribútumok null értéket vesznek fel.

kovacsg@debian :~/ gyakorlat_mysql /db/ migrate$ r a i l s

c o n s o l e

Loading development environment ( R a i l s 3 . 0 . 5 )
i r b ( main ) :001:0 > t = Task . new
=> #<Task id : n i l , number : n i l , u r l : n i l , d e a d l i n e : n i l
, created_at : n i l , updated_at : n i l >
i r b ( main ) :002:0 > t . number=1
=> 1
i r b ( main ) :003:0 > t . u r l =’ http :// l o c a l h o s t :3000/ tasks /1 ’
=> " http :// l o c a l h o s t :3000/ tasks /1"
i r b ( main ) :004:0 > t
=> #<Task id : n i l , number : 1 , u r l : " h t t p :// l o c a l h o s t
:3000/ t a s k s /1" , d e a d l i n e : n i l , created_at : n i l ,
updated_at : n i l >
i r b ( main ) :005:0 > t . save
=> true
i r b ( main ) :006:0 >

A save metódussal elmentettük a létrehozott példányt az adatbázisba, amelyet az adatbáziskezelőn ellenőrizhetünk, amit a 4. ábra is mutat.

4. ábra. Az elmetett rekord

Végül meggyőződhetünk arról, hogy az adatbázisban módosított érték (a deadline attribútum értéke) a modellben is módosul.

kovacsg@debian :~/ gyakorlat_mysql /db/ migrate$ r a i l s

c o n s o l e

Loading development environment ( R a i l s 3 . 0 . 5 )
i r b ( main ) :001:0 > t = Task . f i n d : f i r s t
=> #<Task id : 1 , number : 1 , u r l : " h t t p :// l o c a l h o s t
:3000/ t a s k s /1" , d e a d l i n e : "2011−02−28 23:59:59" ,
created_at : "2011−03−01 12:17:26" , updated_at :
"2011−03−01 12:17:26" >
i r b ( main ) :002:0 > t . deadline
=> Mon, 28 Feb 2011 2 3 : 5 9 : 5 9 UTC +00:00

Hivatkozások

[1] David Heinemeier Hansson et al. Sam Ruby, Dave Thomas. Agile Web Development with Rails, volume Third Edition. The Pragmatic Bookshelf, 2009 Mar.