Documente Academic
Documente Profesional
Documente Cultură
gestiune de baze de date. Rails se remarca dintre alte zeci de astfel de aplicatii ce pot fi gasite
in intreaga lume prin aceea ca permite un cadru software de lucru in care dezvoltarea
aplicatiilor se face de aproximativ 10 ori mai rapid decat in cazul mediului Java. Rails se
poate integra deasemeni cu Java, Visual Studio 2005, MySql si Sql, javascript, Rhtml, CSS,
php, etc. Rails este urmatoarea generatie in programarea web, iar dezvoltatorii ce il folosesc
vor realiza aplicatii web mai rapid decat aceeia care nu il folosesc. Ruby on Rails face
dezvoltarea softwareului simpla. Se reazizeaza rapid. Este amuzanta. Si cel mai mult? Rails
este disponibila, pe gratis, chiar acum, sub licenta de sursa deschisa MIT (open source MIT
license).
Rails
Iata pe scurt cateva din caracteristicile Rails (in traducere libera: "Sine") conform site-ului
companiei dezvoltatoare Aptana ( http://www.aptana.com/ ):
- Suport unificat pentru Ruby, Rails, Rhtml .... si JS, HTML, CSS!
- marcarea sintaxei, autofinalizare, asistenta codarii, raportarea erorilor, conturarea (schitarea),
etc
- Generarea de cod Ruby: constructori suprascrieri, sabloane, accesorii
- Refactorizarea: variabileleor locale la variabile de instanta, extragerea metodelor, inserarea
de cod inline, redenumirea ...
- Debugger rapid si integrat
- Suport pentru generatoare Rails, Rake, plugins-uri (aplicatii auxiliare), si managementul de
server
- Vizualizarea unitatilor de test si a rezultatelor testarii
- Analiza integrata a codului
- Navigator incapsulat de baze de date si consola de interogare
- Retete cu exemple (snippets) si programe de asistare programator (wizzards)
- Ajutor (Help) integrat, incluzand "Mergi la definitie", "RDoc/RI", si explorator de cod
- Completa integrare cu urmatoarele medii: C++, C, C#, Ch, Asembler, Java, IDL, JavaScript,
Flash (ActionScript 2) files, Perl, Lisp, XML, SQL, *.html;*.htm;*.asp;*.shtml;*.htd;*.jsp,
Visual Basic, Matlab, Fortran, ADA si multe altele. vezi: http://www.rubyonrails.org/docs
Prin urmare Rails este o aplicatie web si un cadru de lucru ce include tot ce este necesar
pentru a creea aplicatii web cu baze de date in acord cu comportamentul de separare ModelAfisare-Control (Model-View-Control). Acest comportament imparte afisarea (deasemeni
numita prezentare) in sabloane "mute" care sunt responsabile in primul rand de inserarea
datelor pre-construite intre instructiunile HTML. Modelul contine obiecte de domeniu
inteligent (precum Cont, Produs, Persoana, Posta) ce inregistreaza toata logica afacerii si
cunoaste cum sa persiste in baza de date. Controlereul gestioneaza cerintele ce vin (ca de
exemplu Salveaza Cont Nou, Improspateaza Produs, Afiseaza Posta) prin manipularea
modelului si directionarea datelor catre afisare.
In Rails, modelul este gestionat de ceea ce se numeste nivel (strat) de cartografiere obiectrelational numit Inregistrare Activa. Acest nivel (strat) permite prezentarea datelor din
este foarte probabil ca orice cititor sa fie motivat si gata de invatare a folosirii mediului Rails Acest
exemplu recent va produce o aplicatie care arata si care are exact aceleasi caracteristici ca si
originalul. In loc sa presupunem ca in loc sa ne apucam noi sa proiectam aceasta aplicatie pentru
prima data haide-ti sa presupunem ca seful vine in biroul nostru chiar inainte de masa de pranz si
spune:
Seful: Hei CB (adica noi). sunt intr-o incurcatura. AM mare nevoie de ajutorul dumneavoastra. am
programata o prezentare pentru seful meu maine dimineata. am facut o mica aplicatie pentru el in
graba. Este vorba de o mare afacere cu el si cred ca el urmeaza sa invite si alti parteneri de afacere
la aceasta demonstratie maine. Poate chiar pe seful lui direct! Problema este ca am folosit un
consultant extern pentru aceeasta aplicatie iar, el se pare ca a castigat la lotto azi-noapte. El nu a
venit azi de dimineata , nu mi-a raspuns la e-mailuri si nici nu a raspuns la telefonul mobil. Si colac
peste pupaza aplicatia a incetat sa functioneze cu aproximativ o ora in urma din niste motive
necunoscute iar, eu nu sunt in stare sa gasesc nici macar codul sursa. CB, asta nu este sfarsitul
povestii pe care vreau sa o prezint sefului meu maine dimineata in biroul sau personal. Se zvoneste
pe la discutiile la o cafea ca voi ati incercat sa obtineti aprobarea pentru o noua unealta de
dezvoltare software. Ati spus ca aceasta va da posibilitatea sa produce-ti cod de zece ori mai rapid
decat cu uneltele pe care le folosim acum?
CB: Da, Acesta se numeste "Ruby on Rails" , si este de cel putin 10 ori mai rapida. Dar nu
am avut nici un succes cu propunerile domnilor. Nu a fost posibil nici macar sa le atarg atentia
asupra lor sa se uite la ele. Ei pur si simplu nu au avut incredere in adoptarea a ceva nou in mediul
lor de dezvoltare la acest moment.
Seful: CB, Trebuie neaparat sa rezolv aceasta situatie cu aplicatia pana maine dimineata. Daca ma
puteti ajuta atunci puteti folosi orice mediu de programare doriti. Numai dati-mi o aplicatie de web
bazata pe getionare de baze de date care arata si se comporta precum cea pe care seful meu a
vazut-o deja. Stiu ca va cer foarte mult. Probabil va rog sa lucrati pana tarziu in noapte. Maine
dimineata am mare nevoie sa fac impresie cu ea. Va spun ceva: Daca sunte-ti de acord sa face-ti o
buna impresie, voi da un telefon si sa incer sa vad daca pot sparge gheata pentru voi ca aceast
mediu de dezvoltare sa fie aprobat de conducere pentru voi in viitor.
CB: (vazand o oportunitate...) Sa va spun ceva sefule. E aproape ora pranzului. Daca ne aduce-ti
niste pitza, si si imi da-ti posibilitatea sa va arat cum Rails ne poate face productivi, cred ca putem
sa iti rezolvam problema pana se sfarseste timpul pranzului.
Seful: Imposibil, fugi-ti de aici! Pana timpul pranzului se sfarseste? Sunte-ti mari, CB.
CB: Nu sefule. Dumneavoastra aduce-ti pitzza si eu voi instala Rails. Persoanele de supraveghere
nu ma vor lasa sa downloadez Rails prin firewall (scutul de protectie) asa ca am adus un Cd azi
dimineata. Voi fi gata cand te vei intoarce inapoi.
Seful: Esti in stare sa instalezi si sa pui in functiune un mediu de dezvoltare pana ma intorc? Si
apoi, in timp ce mancam, esti in stare sa reproduci o aplicatie la care consultantul meu a muncit ...
ahh, nu conteaza. Ma duc. CB, nu te simti jicnit dar, acest lucru este chiar foarte greu de crezut.
Sper sa si ai dreptate.
Deci povestea incepe . Seful merge sa cumpere pitza si noi trebuie sa instalam Rails in mare viteza.
Instant Rails.
http://instantrails.rubyforge.org/wiki/wiki.pl
Iata mai jos cateva imagini semnificative asupra felului si modului de operare si lucru cu Rails:
Pentru
Pentru
Oricare dintre acestea va va putea ajuta sa fiti gata sa demarati dezvoltarea primelor aplicatii
Rails intr-un timp mai mic decat se poate livra o pittza.
Pizza Aici!
Seful: In regula, CB. Iata pitza. Acum stiu ca am fost de acord sa va las sa-mi prezenta-ti noul
utilitar faimos, dar nu am nevoie sa inteleg in detaliu "cum functioneaza?", deci l-am adus pe
Paul cu mine deasemeni. Nu-mi pasa daca voi amandoi intrati in amanunte mai mult daca nu
va pasa sa-l tratati ca un aspect auxiliar. Este in regula?
CB: Desigur, sefule. Buna Paul. Permite-mi sa iti ofer ceva de mancare si vom incepe
imediat! Mi-ai spus ca ai vrut ca aceasta aplicatie sa arate ca aplicatia la care tot voi ati lucrat
de la o vreme incoace. Dar, ai spus ca aplicatia este nefunctionala acum. Ce model de start
aveti pentru mine de la care sa imi incep lucrul?
Seful: Am gasit aceasta poza a imaginii principale afisate de aplicatie (Figura 1) pe biroul
consultantului.
Iata o insemnare pe care am gasit-o pe birou cu detaliile asupra modului cum aplicatia
functioneaza.
Caracteristicile functionale cerute
similar cu legatura "Creeaza o noua reteta". Restul notei de subsol este acelasi in toate
paginile.
o Creeaza o noua reteta - accesand aceasta legatura ne conduce la o forma de
intrare la numele recipientului, descriere, si instructiuni, si la selectia unei
categorii la care sa alocam o reteta.
o Afiseaza toate retetele- Accesarea acestei legaturi afiseaza toate retetele.
aceasta este folosita pentru a restaura afisarea ecranului dupa ce lista a fost
filtrata prin accesarea uneia din Legaturile De Categorie
o Afiseaza toate categoriile- Accesarea acestei legaturi ne conduce la
vizualizarea unei liste pe pagina pentru editarea sau stergerea intrarilor
existente in Categorie (Nota de subsol are legatura "Creeaza o noua
categorie").
Aste-i tot ce avem de facut.
Haide sa scriem codul!
CB: In regula, atunci. Hai sa-i dam drumul! Unul din lucrurile pe care Rails in mod real le
activeaza, Sefule, este o abordare iterativa si incrementala a dezvoltarii. Dupa cum veti vedea
de indata, Rails furnizeaza atat de mult pentru atat de putin efort incat este greu sa nu intrii in
acel ritm. In general, noi parcurgem aceeasi pasi de fiecare data cand dezvoltam o aplicatie
Rails.
1. Generam o aplicatie web de Rails-uri goale.
2. Ne decidem daca sa folosim numele de baza de date prestabilita pe care Rails il alege
sau sa ii spunem lui Rails ce baza de date dorim ca aplicatia sa foloseasca.
3. Daca nu exista deja, creeaza o baza de date pe care aplicatia noastra sa o foloseasca.
4. Decideti-va asupra carei specificatii sa se lucreze.
5. Daca ele nu exista, creeaza tabelele pe care aplicatia noastra va trebui sa le foloseasca
pentru producerea acestei specificatii
6. Genereaza o baza de cod pentru folosirea in tabel(e)
7. Corecteaza si reanalizeaza codul pentru a gasi eventualele erori si greseli.
8. Repeta pasii 4 la 7 pana la finalizare (este gata).
Acestia sunt pasii pe care urmeaza sa ii prezint.
Genereaza o aplicatie Rails goala
CB: Rails este un mediu de programare pentru dezvoltarea aplicatiilor. Aceasta presupune
printre altele ca fiecare aplicatie Rails sa aiba aceeasi structura de baza. Rails face acesta
conventie usor de urmarit prin generarea acelei structuri pentru noi cand ii spunem ca dorim
sa construim o noua aplicatie. Tot ce avem de facut este ...
Deschide o fereastra Prompt de Comanda si navigheaza unde doresti sa pui aplicatia. Aceast
loc este numit directorul Radacina a Rails. Numele sau va varia depinzand de ce sistem de
operare folosim (printre alte lucruri), dar numele si structura directoarelor va fi aceeasi. Deci
de acum inainte, caile despre care vom vorbi vor presupune portiunea de Radacina a Rails
(Rails Root).
Deci cum doriti sa numim aceasta aplicatie?
Rails creaza un subdirector cookbook2 (sub directorul Rails Root ) care contine un arbore
complet de foldere si fisiere pentru o aplicatie goala Rails (Figura 2).
Este important sa ne amintim ca aplicatia Rails este o aplicatie, ci nu un set aproximativ in cea
mai mare masura de pagini statice cu un pic de script adaugat. Aplicatiile Rails genereaza
paginile de web pe care le servesc. Deci este important sa intelegem cum functioneaza
controlerele in Rails si cum se cartografiaza in (si executa) metodele controlerului.
Clasele controlerului gestioneaza cerintele de apel web.. URL-ul cerintei de apel a
vizitatorului este cartografiat catre o clasa de controler si o metoda in clasa; ci nu catre o
pagina de web statica. Cand un vizitator incepe un ciclu cerere apel-raspuns prin introducerea
unui URL pentru aplicatia Rails in browserul acesteia, metoda controlerului de aplicatie este
invocata , in mod tipic primeste sau salveaza ceva date folosind modelele de aplicatie, si apoi
foloseste afisarea aplicatiei pentru a produce HTML pentru ca il trimeata inapoi in browserul
vizitatorului.
Pe langa fisierele din subdirectoarele aplicatiei, se afla alte doua fisiere in alte directoare care
deasemeni se vor edita sau creea. Vom vorbi despre acestea pe scurt, dar cea mai mare parte a
muncii nostre va fi creearea si editarea fisierelor din subdirectoarele aplicatiei.
Decide-te... sau spune-i lui Rails ce fel de baza de date va folosi aplicatia ta
CB: Acum pentru ca am construit o aplicatie Rails goala, avem nevoie sa o informam asupra
ce fel de tip de baza de date sa folosesca. Conventia Rails este ca numele bazei de date ce il
vom folosi in timpul dezvoltarii este numele aplicatiei (cookbook2, in acest caz) concatenat
cu _development (_dezvoltare). Cred ca aceasta va fi multumitor pentru noi.
Vom numi baza noastra de date cookbook2_development. Desi, am lasat parola pentru
dezvoltarea bazei de date necompletata (goala). Aceasta este conventia ce o foloseste Rails
cand genereaza fisierul de configuratie pentru baza de date. Daca am fi setat baza de date de
dezvoltare sa ceara o parola, am fi avut nevoie sa ii spunem lui Rails ce parola sa foloseasca
pentru a o accesa. Pentru a schimba atat numele bazei de date pe care dorim sa o folosim sau
parola folosita pentru accesarea ei, editati fisierul ..\cookbook2\config\database.yml.
Schimbarile pe care trebuie sa le facem sunt aproximativ evidente cand ne uitam in fisier.
Chiar si pentru tine, sefule (spune el facandu-i sefului cu ochiul). Pentru ca noi suntem in
regula cu folosirea conventiilor Rails, nu avem nevoie sa facem chiar si un efort foarte mic de
configurare.
CB: Deci acum trebuie sa creem baza de date cookbook2_development. Nu stiu ce ai auzit
despre ce ti-am povestit Sefule, dar vreau sa fiu sigur ca stii ca nu oblig Rails sa inlocuiasca
utilitarele si aplicatiile sotware ale noastre existente. Partea dulce a Rails este construirea
aplicatiilor web conduse de baze de date. Nu sunt pentru a-i permite prajitorului de paine sa
dialogheze cu ceasca de cafea. Sunt platforme mai bune decat Rails pentru acesta. D fapt ...
Paul: Poate ca nu ar trebui sa mergem atat de departe acum, CB.
CB: Ai dreptate, Paul. Scuze pentru aceasta.
Aplicatia nostra Rails are nevoie de o baza de date. Am fost sigur ca motorul MySQL ruleaza.
In fereastra de comanda l-am deshis deja acolo. El se va loga ca user radacina (root user)
$ mysql -u root -p
Deoarece nu am setat o parola pentru aceasta aplicatie o sa apas tasta <Enter> la promptul de
parola.
Si apoi voi creea baza de date:
create database cookbook2_development;
NOTA: Daca nu lucrati intr-un mediu de dezvoltare windows (si in anumite cazuri, chiar daca
lucrati) aceasta permisiune poate sa nu fie necesara. In general, permitand drepturi nelimitate
pentru o baza dumneavostra de date la un user generic este ceva ce nu face-ti in mod usual.
Am inclus acest lucru aici pentru a ajuta asigurarea faptului ca nu vei intalni o problema usor
de evitat in timp ce urmariti acest tutorial (indrumar).
Asta este. Noi Suntem gata cu MySQL deci eu voi ....
Exit
(iesire)
CB: IN REGULA, Sefule. Aceasta imagine de pe ecarn pe care mi-ai prezentat-o arata ca noi
putem creea , citi, improspata, si sterge retete. Nota consultantului pe care mi-ai dat-o spune
ca noi putem face aceleasi lucruri cu categoriile, si ca fiecare reteta este alocata la o singura
categorie. In ansamblu totul pare foarte clar. Unde credeti ca ar trebui sa incepem? (CB
intreaba cu putin ranjet propriuTragandu-lpe sfoara pe sef este asa amuzant)?
Seful: Bine, CB (spuse el putin cam binevoitor), Presupun ca mai bine sa incepem cu creerea
unei retete, corect? Apoi continuam cu citirea ei. Apoi editarea ei apoi stergerea ei Apoi
trebuie sa facem la fel pentru categorii, si apoi trebuie sa le asamblam si sa le interelationam
impreuna. In final ne vom baga in codare reala. Nu-i asa ca acesta este modul in care in mod
obisnuit noi realizam acest lucruri?
CB: Da. Acesta este modul obisnuit de a face aceste lucruri, Sefule. Mereu asa si tot asa . Si
acesta este si punctul de vedere in Rails. Urmeaza sa facem aceleasi lucruri de fiecare data
cand dezvoltam o aplicatie bazata pe o baza de date. Haide-ti sa automatizam acest lucru si sa
trecem la treaba. Rails presupune ca noi urmeaza ca noi sa avem nevoie sa creem, citim
improspatam si stergem orice data despre care ii spunem ca urmeaza sa o folosim. Odata ce
avem tabelele bazelor de date pentru aceasta in vederea lucrului cu ele, Rails va genera tot
codul de baza de care avem nevoie. Aceasta inseamna ca noi putem sa ne permitem sa
avansam cu pasi mai rapizi decat o facem in mod uzual. Aici este locul unde productivitatea
inzecita isi face aparitia.
Aceasta aplicatie este in general foarte simpla pentru Rails. De fapt, este chiar in punctul cel
mai proeminent si dulce al lui Rails, deci hade-ti sa urmam un salt rapid.
Creeaza tabelele pe care aplicatia dumneavoastra le va necesita pentru a produce aceste specificatii (caracteristici)
CB: Este aparent ca vom avea nevoie de un tabel pentru retete si un altul pentru categorii.
Relatia dintre cele doua este 1-la-multe categorii pentru retete. Aceasta inseamna ca avem
nevoie sa includem un camp cheie strain in tabelul de retete: recipes.
O sa deschid editorul de text favorit si voi scrie cateva linii de script SQL, pentru a le creea.
CB: Hei Paul, Iti amintesti ca am spus ca sunt doua fisiere in afara directorului de aplicatie in
care lucram? Scriptul SQL pentru a seta tabelele pe care aplicatia le foloseste este unul din
ele. Deci Sefule acum am salvat fisierul in ..\cookbook2\db\create.sql, si suntem gata sa creem
tabelele.
In fereastra promptului de comanda pe care o tin deschisa, ma mut in directorul cookbook2.
Dupa ce ma asigur ca sunt in directorul cookbook2, introduc:
mysql cookbook2_development <db\create.sql
MySQL executa scriptul si se intoarce la linia de comanda fara sa ne spuna nimic. Aceasta
inseamna ca totul a decurs in regula. Baza noastra de date contine doua tabele goale: recipes
(retete) si categories (categorii).
Paul: CB, acel script seamana cu un script MySQL. aceasta poate fi o problema pentru
persoanele de la controlul tehnic de calitate.
CB: Stiu. O alta parte secundara a scripturilor SQL este pierderea datelor cand va decideti ca
aveti nevoie de un camp in tabel. Partea buna cu scripturile este ele sunt foarte usore. De
aceea eu folosesc unul aici Sefule.
Din fericire Rails ne da o unealta numita migrations (migrari). Este putin cam mult sa intram
in amanunte despre ea acum, dar migrarile ne permit sa efectuam mult din munca noastra pe
modele in mod incremental fara sa pierdem datele de fiecare data cand facem o schimbare.
Poate vom avea o sansa sa vorbim mai mult despre asta mai tarziu.
Genereaza o baza de cod pentru a fi folosita in tabel(e)
CB: Acum ca avem tabelele la care Rails se poate uita, le vom cere sa genereze aplicatia
noastra de baza. In jargonul Rails aceasta, se numeste scaffolding (structurare). In linia
promptului de comanda, aveti grija ca suntem inca in subdirectorul cookbook2, voi introduce:
ruby script\generate scaffold recipe recipe
Aceasta ii spune lui Rails sa genereze un model de baza, controlerul, si fisierele de afisare
(Figura 5) pentru partea din aplicatia noastra care va folosi un tabel de Categorii. Ca si mai
inainte, Rails va denumi fisierul de model si il va plasa in
..\cookbook2\app\models\category.rb si va numi fisierul de controler si il va plasa in
..\cookbook2\app\controllers\category_controller.rb.
CB: Urmeaza sa folosin serverul de web numit Mongrel pentru a va servi aplicatia. Pentru a il
porni, in sub-directorul cookbook2 din linia de comanda, voi introduce:
mongrel_rails start
CB: Este adevarat dar acest lucru nu inseamna ca nu am fost productiv. Aici; ... ia tastatura.
Acum deschide o fereastra de browser si puncteaz-o la http://localhost:3000/category (Figura
7).
Paul: Nu am auzit niciodata de Mongrel, CB. Chiar trebuie ca aplicatiile Rails sa il
foloseasca?
CB: Deloc, Paul. Mongrel este un server de web foarte usor, si foarte prietenos cu Rails. Este
renumit pentru deservirea aplicatiei noastre local in timpul dezvoltarii, si este larg folosit in
medii de productie, deasemeni. Totusi, nu este un lucru care trebuie folosit obligatoriu. Sunt
numeroase alternative. Putem intra in detalii despre acest lucru mai tarziu.
CB: Si nu am scris inca nici macar o bucatica de cod! Probabil ca sunte-ti nerabdator sa o
faceti, dar inainte sa va apucati hai sa servim putina pizza 'Pentru ca stiti, cu Rails, putem sa
avem felia si sa mancam deasemeni!
Paul: Buna pizza. Multumesc, Sefule. Asculta, Stiu ca ne-ai intrebat sa vorbim despre
detaliile chestiunilor secundare, dar as muri sa vad ca codul generat de Rails ar produce asa
ceva. V-ar deranja daca l-as ruga pe CB sa isi rezerve cateva momente si sa ne prezinte acest
aspect?
Seful: De fapt , Paul, sunt destul de interesat in vizionarea acestui aspect eu insumi, CB, esti
dragut? Dar te rog prezinta pe scurt, OK?
CB: Nici o problema. ("E usor acum," CB ramane ranjind. "Nu vrei sa trag de maner.")
Haide sa ne aruncam ochii pe codul de controler pentru retete (Figura 12). Amintiti-va ca
Rails stocheaza codul controlerului din directorul controlere intr-un fisier cu numele pe care il
alege bazat pe argumentele ce noi le-am furnizat cand am generat structurarea (scaffolding).
In cazul nostru, i-am spus sa genereze un model si un controler; ambele numite recipe
(reteta). Controlerul este botezat recipe_controller.
de mana cod HTML in forme pe care vizitatorul le foloseste pentru a introduce date. Apoi am
codat metoda de creeare pe partea de server pentru a salva datele cand forma a fost trimisa.
Amintesteti ca Rails, genereaza paginile pe care le deserveste, deci urmeaza sa creeze o forma
HTML pentru noi. Metoda de NOU si EDITARE numai furnizeaza un obiect pentru ca forma
sa il foloseasca. Metodele de creeare si inoire salveaza obiectul in baza de date cand forma
este trimisa.
Seful: In regula. Cred ca inteleg bazele acum. Paul, esti de acord sa mergem mai departe
acum?
Paul: In regula, Sefule. Ma voi intalni cu CB mai tarziu pentru ca sa imi prezinte mai in
amanunt aceste aspecte.
CB: In regula, acum. Haide-ti sa ne intoarcem inapoi la problema. Probabil ca ati observat ca
nu exista nici o metoda de a atribui o categorie pe o pagina de recipient nou. acesta deoarece
i-am spus lui MySQL, ca fiecare reteta sa aiba o categorie, dar nu i-am spus lui Rails acelasi
lucru. Tot ce am nevoie sa fac este sa ii spun lui Rails cum cele doua sunt inrudite si sa adaug
doua linii in fisierul de afisare pentru pagina de reteta noua.
O sa-i spun lui Rails despre relatia dintre retete si categorii in modelele lor. In fisierul
cookbook2\app\models\category.rb (Figure 13), o sa-i spun lui Rails ca fiecare director va
avea mai multe recipiente alocate la el prin adaugarea unei linii.
has_many :recipes
Pentru a da vizitatorului abilitatea de a selecta o categorie, avem nevoie sa adaugam doua linii
la afisajul noii retete. acest fisier de afisare pentru metoda new (nou) in reteta (recipe)
controlerului este in subdirectorul de reteta sub afisari (views). Pentru a ajusta aceasta afisare
(view), voi deschide fisierul cookbook2\app\views\recipe\_form.rhtml (Figura 15).
Prima linie este un cod HTML pur. a doua linie este un cod Ruby. Rails vede portiunea <
% ... %> si stie ca ce este inauntru este un cod Ruby incapsulat (embedded) de care are
nevoie pentru a executa generarea codului HTML pe care trebuie sa-l trimita inapoi
browserului. Deoarece acesta are semnul =, Rails va genera codul HTML ce avem nevoie
pentru o eticheta de selectie (select tag). Daca nu ar fi avut semnul = semn, si vom vedea
cateva exemple de acest gen deasemeni, Rails ar fi executat codul dar nu ar fi generat nici un
cod HTML. E posibil sa fi observat ca noua pagina de retetalasa vizitatorul sa selecteze data,
dar cerintele spun ca sistemul trebuie sa aloce data. Cand sunt aici, urmeaza sa sterg liniile
care permit utilizatorului sa faca acest lucru. acum trebuie sa avem o forma partiala care arata
ca in Figura 16.
CB: Acum trebuie sa avem sistemul alocand o data ori de cate ori cineva creeaza sau
reinoieste (update) o reteta. Aceasta necesita sa se intample in controlerul de reteta, deci voi
deschide cookbook2\app\controllers\recipe_controller.rb (Figura 17) si voi aduga o linie la
ambele metode create si update. (creeaza si reinoieste)
@recipe.date = Time.now
Done!
CB: In regula, Sefule. Noi am adaugat 6 linii de cod. Este timpul sa ne verificam treaba. am
modificat fisierele model deci este nevoie sa repornesc serverul nostru de web: mongrel. din
motive de performanta, chiar si in modul de dezvoltare Rails numai citeste fisierele model ale
aplicatiei la pornire (startup). Ori de cate ori noi modificam un model Rails, trebuie sa
repornim serverul nostru de web. Pentru a opri Mongrel, in fereastra de comanda, Ctrl-C. apoi
il repornesc, introduc ...
mongrel_rails start
CB: In regula, Sefule. Esti gata sa faci onorurile? Indreapta browserul nostru catre
http://localhost:3000/recipe/new, si ...
Voil! Data a disparut si este o lista de selectie pentru Category (Categorie).
Paul: Am observat ca in controler, cea mai mare parte a referintelor au fost catre o variabila
numita @recipe. Aici in forma, desi, arata ca si cum ai referii acelasi obiect folosind o sintaxa
diferita.
CB: Ai dreptate, Paul. Textul text_field foloseste o sintaxa diferita, dar se refera exact la
acelasi obiect pe care controlerul il foloseste cu o variabila de instanta. Poate fi nitel cam
confundabil la inceput. Exista totusi o explicatie mult mai precisa, dar uite cum am gasit eu de
cuvinta sa o exprim direct cand am inceput. am folosit o variabila de instanta pentru a impinge
treburile catre user. Orice variabila de instanta pe care o creez in controlerul meu este
disponibila automat pentru afisajul ce il folosesc pentru generarea fisierului HTML pe care il
voi trimite inapoi catre browserul vizitatorului. Cand am nevoie sa obtin informatie de la
vizitator, ma voi intoarce inapoi la ceva cunoscut ca tabela hash de parametrii (params hash).
Aceasta este o structura de date care se construieste in browserul vizitatorului si este trimisa
inapoi cand acesta porneste un nou ciclu cerere-raspuns. Sintaxa text_field, de exemplu, de
fapt ma ajutat sa imi amintesc cum sa scot datele afara din forma. Daca am un text_field intr-o
forma ca de exemplu <%= text_field 'recipe,' 'description,' %> atunci il pot accesa
in controler cu @recipe.description = params[:recipe][:description], sau il pot
prezenta inapoi vizitatorului intr-un nou ciclu daca vreau ca prin folosirea @recipe =
Recipe.find(the_one_I_want) in controler, si apoi folosirea <%= @recipe.description
%> in afisare. Este mult mai mult de spus despre el decat atat, binenteles, dar ma ajutat sa
mentin explicatiile clare la inceput.
Figura 20. Vedere de ansamblu asupra listei cu reteta generata de Rails (Rails-generated
recipe list view)
CB: Urmeaza sa facem cateva schimbari oarecum majore aici. Trebuie sa o fac sa arate dupa
cum urmeaza:
<table border="1">
<tr>
<th width="60%"><em>Recipe</em</th>
<th width="20%"><em>Category</em></th>
<th width="20%"><em>Date</em</th>
</tr>
<% for recipe in @recipes %>
<tr>
<td><%= link_to %Q{#{recipe.title}}, :action => 'show', :id => recipe
%>
<%= link_to '(delete)', { :action => 'destroy', :id => recipe },
:confirm => 'Are you sure?', :post => true %></td>
<td><%= link_to %Q{#{recipe.category.name}},
{:action => 'list', :category_id => recipe.category.id}
%></td>
<td><%=h recipe.date %></td>
</tr>
<% end %>
</table>
CB: In Regula. Dupa socoteala mea, noi am adaugat deja sapte linii de cod. Ar fi mai bine sa
ne verificam treaba ;-) Sefule, esti dragut sa iti reimprospatezi pagina de web din browser
(dai un refresh in browser)?
CB: Ei, Paul. Iti amintesti ce ti-am spus depre variabilele de instanta in contrast cu
parametrii? Vezi cum folosim variabila de instanta @recipes in bucla for? Valoarea sa este
setata in controler, si acum noi o folosim in afisaj pentru a creea afisarea in pagina pe care o
trimitem inapoi catre vizitator.
<title>Online Cookbook</title>
Rails aplica ce gaseste aici pentru toate paginile pe care aplicatia le deserveste. Deci prin
adaugarea a numai cateva linii voi adauga o notita de subsol pe fiecare pagina
<p><% if params[:controller] == 'recipe' %>
<%= link_to "Create new recipe", :controller => "recipe", :action =>
"new" %>
<% else %>
<%= link_to "Create new category", :controller => "category", :action
=> "new" %>
<% end %>
<%= link_to "Show all recipes", :controller => "recipe", :action =>
"list" %>
<%= link_to "Show all categories", :controller => "category", :action =>
"list" %></p>
Ceea ce ne da Figura 23
De aceasta data voi lasa in pace antetele tabelului (table headings) deoarece este doar unul
singur iar acesta pare in ordine. Aceasta inseamna ca trebuie numai sa inlocuiesc codul
generat de liniile tabelului.
<td><%= link_to %Q{#{category.send(column.name)}}, :action => 'show', :id
=> category %>
Apoi sa sterg liniile sub eticheta </table>. Acum pentru ca suntem gata cu aceasta... (Figura
28).
Odata ce voi fi gata, o sa slvez fisierul. In regula, Sefule. Am mai adaugat alte 6 linii de cod.
Stii ce inseamna asta;-)
Seful: Cred ca incep sa intru in ritm ;-) Hai sa vedem. Improspateaza pagina in browser, apoi
accseaza (click) pe legatura la bauturi alcolice (beverages link) (Figure 31).
CB: Numai ca sa te asiguri deja, de ce sa nu ii dai o rulare de la cap la coada. Idee: Acceseaza
( Click) pe legatura Arata toate categoriile (Show all categories link), apoi acceseaza (click)
legatura (delete) link (stergere) in categoria Bauturi alcolice ( Beverages category).
Seful: Ei! Asta nu e corect! (Figura 33)
Mesajul de eroare ne spune ca tocmai am incercat sa stergemo inregistrare care are copii.
Rails ne-a oprit din stergerea accidentala a unui manunchi de retete. Sunt o gramada fe feluri
in care noi putem sa abordam acest aspect dar cerintele nu spun nimic despre aceasta situatie
si mai ales cum sa ne descurcam in acest caz. Aceasta este intradevar o decizie pe care clientul
trebuie sa o ia singur. Momentan o sa o fixez
In asa fel incat aplicatia sa nu esueze (crash). Apoi tu poti sa iti intrebi seful maine asupra
modului in care el vrea ca ea sa lucreze. Voi adauga niste cod pentru a ignora cerinta asupra
faptului daca exista inregistrari de copii (child records). Codul merge in metoda distrugere
(destroy method) din categoria fisierului controlerului
(cookbook2\app\controllers\category_controller.rb). La inceput voi voi interoga toate retetele
care au fost alocate categoriei pe care urmeaza sa o sterg.
recipes = Recipe.find(:all, :conditions => ["category_id = ?",
params[:id]])
Apoi o sa invelesc stergerea inregistrarii (record deletion) intr-o instructiune if (daca) care nu
va permite ca stergerea sa se intample daca Rails a gasit vreo inregistrare.
if recipes.empty?
Category.find(params[:id]).destroy
end
Rails code:
31 lines
31 linii de cod? Nici un fisier de configuratie? Un singur script SQL si 8 linii de intrare in
linia de comanda? Si suntem gata?
Seful: Ai dreptate. Aceasta este nemaipomenit. Spuneai ca ai nevoie de ajutor in privinta
persoanelor de la CTC (Ops guys)? Sunt alaturi de tine. Am de gand sa-i spun sefului meu
despre asta maine dimineata. Aveti cateva cuvinte pe care mi-ati sugera sa le folosesc?
CB: Ai intuit corect. Spune-i asta.
Rails este urmtoarea generatie in programarea web, iar dezvoltatorii ce il folosesc vor realiza
aplicatii web mai rapid decat aceeia care nu il folosesc. Ruby on Rails face dezvoltarea
softwareului simpla. Se reazizeaza rapid. Este amuzanta. Si cel mai mult? Rails este
disponibila, pe gratis, chiar acum, sub licenta de sursa deschisa MIT (open source MIT
license).
Seful: Voi face asta, CB. Si am de gand sa dau un telefon la CTC (Ops)chiar acum. Urmatorul
lucru de care am nevoie de la voi este sa imi da-ti ceva informatie despre cum pot sa invat mai
multe despre Rails. Si inca o data va multumesc. Aceasta a fost in mod clar un pret de merit
pentru o pitzza!.
SFARSIT ( a povestii noastre, dar INCEPUTUL, speram, al aventurii dumneavoastra in
RAILS!)
Resurse si Bibliografie:
Pagini web:
Lista de poste: