Invata Ruby on Rails de la zero (Partea a III-a)
22.03.2009
In acest tutorial vei putea citi despre cateva caracteristici ale platformei rails, despre cum sa manipulezi structura unui proiect si despre cum sa adaugi linkuri si sa comentezi codul.
4904 afisari 0 Rating (2 voturi) 25 min

In acest tutorial vei putea citi despre cateva caracteristici ale framework-ului rails, despre cum sa manipulezi structura unui proiect si despre cum sa adaugi linkuri si sa comentezi codul.

Daca nu ai parcurs partile I si II ale acestei serii, este recomandat sa le citesti inainte de a trece mai departe:

Acum ca ai invatat cum sa setezi variabilele globale astfel incat sa transfere informatiile de la un controler la view, este timpul sa inveti cum sa transmiti datele intre diferite actiuni din controler. Pentru acest tutorial vom folosi in continuare controlerul learn. Nu este necesar sa folosesti aceleasi exemple din tutorialul precedent, dar daca le consideri o resursa buna, le poti utiliza.

Apelarea unei actiuni dintr-o alta actiune

Pentru acest exemplu, foloseste-te de cunostintele dobandite saptamana trecuta despre variabilele globale si aplica-le. Mai intai trebuie sa creezi doua actiuni denumite another_action si text, urmand ca apoi sa iei actiunile din text si sa le pui in another_action. Pentru a demonstra functionalitatea scriptului, vom crea o variabila globala care va afisata in actiunea text, apelata din another_action. Codul este:

class LearnController < ApplicationController   
  def another_action   
    text   
  end  
  
  def text   
    @text = 'Acest text provine dintr-o alta actiune' 
  end  
  end

In continuare vei crea un view denumit another_action.rhtml, care afiseaza variabila text.

 
<html>  
  <head>  
  <title>Actiune Demo</title>  
  </head>  
<body>  
       
  <%= @text %>  
  </body>  
  </html>

Explicatie

Dupa cum poti observa, am creat o referinta la actiunea text prin adaugarea ei in interiorul actiunii another_action, ceea ce include in mod implicit si definitia variabilei text.Pentru a demonstra acest principiu, sa analizam diferite situatii.

Cazul 1- Initializarea unei variabile cu o actiune

class LearnController < ApplicationController   
       
    def another_action   
        @text = text   
    end  
       
    def text   
        misc_text = 'Acest text a fost transmis!'  
    end    
end

Rezultatul cazului 1

Cazul 2 - Inlocuirea unei variabile

Acum lucrurile vor deveni mai complicate.

   
class LearnController < ApplicationController   
       
    def another_action   
        @text = "text pe care nu il vei vedea"  
        @text = text   
   end  
       
    def text   
        wanted_text = overwrite_view   
    end  
       
    def overwrite_view   
        overwrite_text = 'Acest text rescrie textul original'  
    end  
end

Rezultatul cazului 2

Aceasta este ordinea evenimentelor executate de ultimul cod:

  • Initializeaza variabila globala text cu sirul de caractere "text pe care nu il vei vedea";
  • Rescrie variabila text cu actiunea text;
  • Variabila text are acum valoarea variabilei locale wanted_text;
  • Variabila wanted_text este initializata cu actiunea overwrite_view;
  • overwrite_view are o variabila locala cu valoarea "Acest text rescrie textul original";
  • Acesta te duce inapoi la variabila @text.

Cazul 3 - transmiterea unei variabile

Acest exemplu este mai simplu:

class LearnController < ApplicationController   
       
    def another_action   
        @text = "text pe care nu il vei vedea"  
        text   
    end  
       
    def text   
        @text = 'Acest text rescrie textul original' 
    end  
end

Rezultatul cazului 3

Cazul 4 - returnarea unei valori

class LearnController < ApplicationController   
       
    def another_action   
        @text = text   
    end  
       
    def text   
        first = 'Acest text nu ar trebui sa fie transmis variabilei @text'  
        second = 'Acest text va fi implicit retinut in variabila'  
        return first   
    end  
           
end

Acest exemplu este mai important deoarece introduce un element nou in sintaxa: comanda return, care spune actiunii ce valoare sa returneze.

Rezultatul cazului 4

Linkuri Rails

Daca esti cat de cat familiar cu HTML, ar trebui sa stii ca un link este definit de un tag < a href="">Text< /a>. Framework-ul Rails iti ofera o metoda alternativa, ce poate fi utilizata doar in fisiere .rhtml, nu si in fisiere .rb. Iata un exemplu:

<html>   
<head>   
<title>Rails Link Demo</title>   
</head>   
<body>   
<%= link_to('Link catre Another Action', :controller => 'learn', :action => 'another_action')%>   
</body>   
</html>

Intr-o prima faza te-ai putea intreba de ce ai vrea sa schimbi modalitatea in care scrii linkurile, cu atat mai mult cu cat inlocuirea necesita mult timp. Motivul principal este ca un astfel de link este mai lizibil.

In ceea ce priveste sintaxa, partea care contine "controler =>" nu este necesara daca linkul duce catre o actiune ce face parte din acelasi controler.

De asemenea, trebuie sa retii ca sintaxa "controller =>" reprezinta un simbol, care va fi utilizat si in alte exemple.

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.

Copyright © 2008-2010 E-LEARN.ro. Toate drepturile rezervate. Conceput si realizat de Neokinetics Software.