Ruby on Rails de la Scratch Week 3

Bine ați venit la Ruby on Rails From Scratch Week 3! În această săptămână, ne vom concentra pe anumite lucruri pe care trebuie să le cunoașteți despre acest cadru. De exemplu, vom vorbi despre manipularea structurii proiectului în două moduri (redare și redirecționare). De asemenea, vom vorbi despre modul în care adăugați linkuri în șine și cum să comentați codul. Să începem deja!

A prinde

Dacă nu ați citit părțile 1 și 2, este recomandat să le examinați înainte de a continua cu acest tutorial.

  • Saptamana unu
  • Săptămâna a doua

Adăugarea de interacțiuni între acțiuni

Acum, că am învățat cum să setăm variabilele de instanță pentru a transfera informații de la controler la vizualizare, este timpul să învățăm cum să transmitem date între diferite acțiuni într-un controler. Pentru acest tutorial, vom continua să folosim controlerul de învățare. Nu avem nevoie să păstrăm ceea ce am făcut săptămâna trecută, dar puteți dacă credeți că este o resursă bună .. Vom începe simplu:

Efectuați o altă acțiune într-o altă acțiune

Pentru acest exemplu, rubrica este mai complexă decât lecția reală. Vom folosi pur și simplu ceea ce este într-o singură acțiune și vom face același lucru în altul. Să folosim cunoștințele pe care le-am câștigat săptămâna trecută despre variabilele instanțelor și să le aplicăm acum. Mai întâi, hai să creăm o nouă acțiune numită "another_action"; apoi o altă acțiune numită "text". Vom primi apoi acțiunea din text și vom pune în "another_action". Vom demonstra acest lucru, referindu-ne la o variabilă de instanță în opinia "alte_acțiune" care a fost atribuită în controlerul "text". Ne pare rău, dacă asta nu avea sens. Dacă nu ați primit ceea ce am spus, uitați-vă la următorul cod, care, sperăm, vă va ajuta:

 clasa LearnController < ApplicationController def another_action text end def text @text = 'This text came from another action' end end

Apoi vom crea o vedere denumită "another_action.html.erb", unde vom face referire la textul variabil.

  Demo de acțiune   <%= @text %>  

Explicaţie

După cum puteți vedea, am referit acțiunea "text" pur și simplu prin punerea acelui interior în "other_action". Procedând astfel, am trecut și definiția "textului", care a fost variabila de instanță. Pentru a demonstra mai mult acest principiu, să punem acest lucru în mai multe situații diferite, toate acestea funcționează.

Situația 1- Setarea unei variabile egale la o acțiune

 clasa LearnController < ApplicationController def another_action @text = text end def text misc_text = 'This text really traveled!' end end

Situația 1 Rezultat

Situația 2 - Înlocuiți variabila

Acum o să devenim și mai complexă:

 clasa LearnController < ApplicationController def another_action @text = "text you'll never see" @text = text end def text wanted_text = overwrite_view end def overwrite_view overwrite_text = 'This text overwrote the original text' end end

Situația 2 Rezultat

Aceasta este ordinea evenimentelor pe care le-a făcut următorul cod:

  • Dă variabilei de instanță "text" o valoare a "textului pe care nu îl veți vedea"
  • Apoi a re-atribuit-o acțiunii "text"
  • Variabila "text" are acum valoarea textului dorit de variabila locala.
  • Variabila wanted_text are o valoare a acțiunii "overwrite_view"
  • Overwrite_view are o variabilă locală cu valoarea "Acest text a suprascris textul original"
  • Aceasta returnează variabila instanță a lui @text.

Situația 3 efectuați o variabilă

Vom păstra acest lucru mai simplu:

clasa LearnController < ApplicationController def another_action @text = "text you'll never see" text end def text @text = 'This text overwrote the original text' end end


Situația 3 Rezultat

Situația 4 Returnează ceva specific

clasa LearnController < ApplicationController def another_action @text = text end def text first = 'This text should not be passed to @text' second = 'This text would be put into the variable on default' return first end end

Acest exemplu este deosebit de important, deoarece învățați acum o sintaxă mai mică; întoarcere comanda. Aceasta va spune acțiunii ce trebuie să se întoarcă la sfârșit.

Situația 4 Rezultat

Rails Link-uri

Toată lumea ar trebui să știe deja cum să creeze un link HTML normal. (Utilizarea Text) Dar există și o modalitate de ao face cu Rails. Această metodă nu este Ruby, ci mai degrabă o parte a cadrului. Acestea fiind spuse, îl puteți folosi numai în fișiere HTML rubinate încorporate, nu în fișiere pure rb. Deci cum o facem? Iată codul:

  Rails Link Demo   <%= link_to('Another Action Link', :controller => 'learn',: action => 'alt_action')%>  

La prima vedere, s-ar putea să vă întrebați de ce ați schimba vreodată modul în care scrieți legături, mai ales dacă înlocuirea este mai lungă! Ei bine, un motiv principal este lizibilitatea. Puteți citi cu ușurință acest lucru și știți exact la ce se va lega. În ceea ce privește lungimea, partea controler => nu este necesară dacă conectați la o acțiune în același controler.

Cu acest cod de șine, vedem și simboluri. ": Controller =>" este un simbol. Vom vorbi mai mult despre ceea ce fac mai tarziu, dar pentru moment, doar recunoasteti colonul.

Realizarea în Rails

La începutul acestei serii, am vorbit puțin despre nerespectarea sensibilă a șinelor. Una dintre valorile implicite este generarea unei vizualizări care are același nume ca acțiunea din vizualizarea corespunzătoare. Dar dacă am fi vrut să înlocuim ceea ce face șinele în mod automat? Acest lucru este de fapt destul de ușor și o tehnică foarte utilă. Când lucrați la un proiect din lumea reală, puteți să vă imaginați cum ar putea obține "controlarea" de către controlorul dvs., dacă ar trebui să creați o vizualizare și o acțiune separată în controler pentru fiecare pagină. Rails are o soluție, totuși, numită redare. Redare vă permite să specificați ce vizualizare să utilizați pentru fiecare acțiune. Țineți minte, totuși, că, asemenea unor linii de șine, acesta este și codul exclusiv al șinelor, și nu rubinul, și însemnat numai pentru controlor.

Dacă cele de mai sus v-au lăsat puțin confuz, permiteți-mi să vă arăt cum să faceți acest lucru. Acest lucru va spera, sperăm, puțin. Pentru acest prim exemplu, vom face acțiunea la opinia că, în mod normal, ar face oricum. În alte condiții, acest cod de redare nu face nimic care să nu se întâmple fără ea. Tot ce face este să arate un cod care, de obicei, este doar "asumat".

 def index rendere: action => 'index' sfârșit

Realizarea unei acțiuni pentru o altă vizionare

Ultimul exemplu nu este cu adevărat util, deoarece rezultatul este obținut automat oricum. Dar dacă ați avea o viziune cu adevărat avansată pentru o altă acțiune și ați dorit aceeași viziune pentru o acțiune diferită. Nu ar fi greu doar să creați o altă viziune identică pentru fiecare acțiune pe care o creați, dar ar fi aproape imposibil să actualizați! Toate acestea pot fi rezolvate prin redarea oricăror acțiuni similare unei acțiuni specifice. Examinați următoarea bucată de cod pe care o voi explica după aceea și observați diferitele părți.

text_controller.rb:

 clasa LearnController < ApplicationController def index render :action => textul "definitiv text" definiție @text = 'Text'end def alt @text ='Alte'render: action =>' sfârșitul textului '

text.html.erb:

   Rails Rendering Demo 

Bine ai venit la <%= @text %> Pagină

Explicarea codului:

Acțiune index

S-ar putea să fi observat că am inclus o acțiune denumită "index". Această acțiune va fi văzută dacă urcați un director pentru a "învăța". Funcționează ca un fișier de index obișnuit. Cu toate acestea, nu trebuie să creați o acțiune specifică pentru index. Puteți utiliza subiectul acoperit anterior despre moștenirea unei alte acțiuni.

Rendering la aceeași vedere

Pentru acest exemplu, avem nevoie de o singură viziune pentru toate acțiunile; și toate au produs pagini diferite. Pentru mine, acest lucru este destul de incredibil pentru cantitatea de muncă pe care am pus-o.

Notă: Acest lucru poate părea evident pentru unii, dar aveți grijă de redarea dublă. Redarea dublă va provoca o eroare deoarece încercați să faceți o acțiune în două locuri diferite. Puteți să vă aflați în două locuri simultan? Nu, și nici nu poate o acțiune. Dacă doriți să vedeți cum arată, faceți o acțiune în două vizualizări diferite. Motivul pentru care se întâmplă pe măsură ce faceți proiecte mai complexe se datorează faptului că traseul acțiunilor poate deveni destul de complex și s-ar putea să creați accidental această eroare.

Asigurați-vă că obțineți conceptul de bază de redare, deoarece va fi o tehnică foarte vitală pe care o veți folosi adesea ca dezvoltator de șine.

Redirecționarea unei acțiuni

Redirecționarea unei acțiuni este similară cu redarea unei acțiuni în faptul că și ea este cod de șine și este utilizată numai în controler. De asemenea, aceasta afectează fluxul aplicației. După cum ați putea ghici din nume, redirecționarea vă permite să ... redirecționați bine.

S-ar putea să fii surprins de câte ori folosești comanda de redirecționare. Iată câteva utilizări comune:

  • Crearea de pagini alias
  • Efectuați o acțiune în controler și apoi redirecționați către o pagină secundară
  • Dacă există o eroare, redirecționați către o pagină de eroare
  • Dacă utilizatorul nu este conectat, trimiteți-l la o pagină de conectare

Destul de chit Chat, hai să ajungem la cod! Pentru acest exemplu de cod, vom modifica controlerul ultimului exemplu și vom lăsa vizualizarea la fel. După cum veți vedea, redirecționarea este foarte asemănătoare în format cu redarea:

 clasa LearnController < ApplicationController def index redirect_to :action => textul "definitiv text" definiție @text = 'Text'redirect_to: action =>' alt 'sfarsit def alta render: action =>' end 'sfarsit de text

Acum mergeți la acțiunea index în browserul dvs. Veți observa că veți ajunge la cealaltă acțiune din bara de adrese. Să trecem prin acest cod:

  • În primul rând, redirecționăm spre textul acțiunii. Ca și legarea în șine, puteți specifica și un controler, dacă redirecționați către un alt controler. Ați pune: controller => 'learn', înainte de acțiune.
  • Browserul merge acum la acțiunea textului. Aici stabilește o valoare pentru @text. Dar browserul nu are valoare pentru @text. Acest lucru se datorează faptului că redirecționarea uită în mod esențial orice vă spuneți în acea acțiune.
  • Acum suntem redirecționați către alții. Aici vom reda în vizualizarea text.

Render sau Redirect?

În timp ce există câteva scenarii evidente în care ați alege să faceți sau să redirecționați; pot exista unele decizii mai dificile. O cheie importantă este că dacă trimiteți date într-o bază de date sau altceva care schimbă aplicația, utilizați o redirecționare. În caz contrar, o reîmprospătare ar putea retrimite datele.

Gândurile finale

Sper că ați învățat multe de la tutorialul din această săptămână! Am acoperit o mulțime de concepte importante, astfel încât, dacă sunteți încă confuz de orice, citiți-l din nou. Săptămâna viitoare vom ajunge probabil în sintaxa rubinică!

Ca întotdeauna, nu ezitați să lăsați întrebări în comentarii. De asemenea, vă rugăm să digg acest articol dacă te-a ajutat!