Randarea in Rails
In primul tutorial din aceasta serie au fost prezentate cateva dintre setarile implicite ale platformei rails. Una dintre acestea este generarea automata de view-uri avand aceleasi nume cu actiunile dintr-un controller. Dar daca nu iti doresti asta? Rails iti ofera o alternativa care este utila si usor de implementat. Daca vei lucra la un proiect adevarat in RoR, vei vedea cat de aglomerat poate deveni un controler atunci cand trebuie sa creezi cate o actiune si cate un view pentru fiecare pagina. De aceea, rails vine cu o solutie ce poarte numele de randare (render), care iti ofera posibilitatea de a preciza ce view vrei sa utilizezi pentru fiecare actiune. Totusi, trebuie sa retii ca aceasta metoda, ca si linkurile amintite anterior, nu este cod ruby, ci o caracteristica a platformei rails, ce poate fi folosita doar in cadrul unui controler.
In acest prim exemplu, vom randa actiunea intr-un view care oricum ar fi fost generat in mod implicit. Cu alte cuvinte, rendernu va face nimic in plus:
def index
render :action => 'index'
end
Randarea unei actiuni intr-un alt view
Ultimul exemplu nu este util cu adevarat deoarece nu face nimic in plus fata de setarile implicite ale platformei rails. Sa presupunem insa ca ai definit un view complicat pentru o actiune, si vrei sa-l utilizezi si pentru o alta actiune. Desigur, ai putea face o copie a acestui view, dar ar fi destul de dificil sa le actualizezi pe ambele. Poti rezolva aceasta problema prin randarea tutoror actiunilor similare intr-un singur view, ca in urmatorul exemplu:
text_controller.rb:
class LearnController < ApplicationController
def index
render :action => 'text'
end
def text
@text = '<u>Text</u>'
end
def other
@text = '<b>Alt text</b>'
render :action => 'text'
end
end
text.html.erb:
<html>
<head>
<title>Demo randare</title>
</head><P></P>
<body>
<p>Bine ai venit la <%= @text %> Page</p>
<P></P>
</body>
</html><P></P>
Explicarea codului
Actiunea Index
Poti observa ca am inclus o actiune denumita index, pe care o poti vizualiza daca accesezi directorul learn. Aceasta actiune functioneaza similar cu un fisier index.
Randarea in acelasi view
Pentru acest exemplu aveam nevoie de un singur view pentru toate actiunile.
Observatie: Ai grija sa nu randezi de doua ori aceeasi actiune, deoarece vei primi un mesaj de eroare. Asa cum tu nu poti fi in doua locuri deodata, nici o actiune nu reuseste acest lucru. Daca vrei sa vezi cum arata aceasta eroare, atribuie o actiune pentru doua view-uri. Pe masura ce faci proiecte mai complexe, actiunile devin mai complexe si mai greu de urmarit, si pot cauza aceasta eroare.
Asigura-te ca intelegi conceptele de baza ale randarii deoarece este o tehnica vitala pentru un developer rails.
Redirectionarea unei actiuni
Asemeni randarii, redirectarea unei actiuni este o caracteristica a platformei rails ce poate fi utilizata doar in cadrul unui controler. In plus, ea afecteaza ordinea executarii operatiilor dintr-o aplicatie. Ai putea fi surprins de numarul mare de situatii in care vei folosi comanda de redirectare. Iata cateva dintre acestea:
- Crearea paginilor alias;
- Executarea unei actiuni intr-un controler, urmata de redirectarea catre o pagina secundara;
- Redirectarea catre o pagina speciala daca a survenit o eroare;
- Redirectarea catre pagina de autentificare daca utilizatorul nu este logat.
Codul de mai jos contine acelasi view din exemplul anterior si controlerul modificat astfel incat sa aiba loc redirectarea:
class LearnController < ApplicationController
def index
redirect_to :action => 'text'
end
def text
@text = '<u>Text</u>'
redirect_to :action => 'other'
end
def other
render :action => 'text'
end
end
Daca apelezi actiunea index in browser, vei observa ca vei fi redirectat catre o alta actiune. Sa analizam codul:
In primul rand, actiunea index trimite la actiunea text. Daca vrei sa redirectezi catre un alt controler, atunci trebuie sa specifici numele acestuia, punand de exemplu :controller => 'learn' inaintea actiunii.
Browserul ajunge la actiunea text, unde este setata variabila @text. Dar browserul nu are nicio valoare pentru @text. Asta se intampla pentru ca redirectionarea nu mai retine nimic din acea actiune.
In final, are loc trimiterea catre actiunea other, care este randata in view-ul text.
Randare sau redirectare?
In unele situatii, este evident daca trebuie sa folosesti randare sau redirectare, dar altele prezinta dificultati. Ceea ce trebuie sa retii este ca redirectarea este recomandata daca ai de transmis informatii catre o baza de date, sau trebuie sa efectuezi orice alta activitate care afecteaza starea aplicatiei. In caz contrar, datele ar fi retransmise la refresh.
Incheiere
Sper ca ai invatat ceva din acest tutorial. Am introdus foarte multe concepte noi si de aceea daca ceva iti este neclar ar fi bine sa recitesti tutorialul.
|