Rusrails făcând răspunsuri (partea întâi)

Din punctul de vedere al operatorului, există trei modalități de a crea un răspuns HTTP:

Vom deschide fiecare dintre aceste metode în schimb. Dar mai întâi un pic despre cel mai simplu lucru pe care un controler îl poate face pentru a crea un răspuns: nu faceți nimic.

Implicit redimensionare: Acord de configurare în acțiune

Ați auzit deja că Rails promovează principiul "convenției asupra configurației". Realizarea în mod prestabilit este un exemplu perfect în acest sens. Implicit, controlorii din Rails fac automat afișările cu numele corespunzător acțiunii. De exemplu, dacă există un astfel de cod în clasa BooksController:

Și următoarele în dosarul rutelor:

Și aveți un fișier de vizualizare app / views / books / index.html.erb:

Cu toate acestea, acest mesaj este foarte puțin util, așa că în curând veți crea un model de carte și veți adăuga un index de acțiune la BooksController:

Din nou, rețineți că avem un acord de mai sus de configurare este că nu există nici un exces de a face la sfârșitul acestui indice de acțiune. Regula este că nu aveți nevoie de ceva pentru a face redundante la sfârșitul jocurilor de acțiune controler, șine va arăta action_name.html.erb șablon Vyuha controler de mod și va face, astfel încât în ​​acest caz, Rails va face app fișier / vederi / cărți / index.html .erb.

Deci, în opinia noastră, dorim să afișăm proprietățile tuturor cărților, aceasta se face folosind șablonul ERB. cum ar fi:

De fapt, randarea se face prin subclasele ActionView :: TemplateHandlers. Nu vom trece în acest proces, dar este important să știm că extensia de fișiere a vizualizării controlează selectarea formatorului de șabloane. Începând cu Rails 2, extensiile standard sunt .erb pentru ERB (HTML cu built-in Ruby) și .builder pentru Builder (generator XML).

Utilizarea randării

În multe cazuri, metoda ActionController :: Base # render face o treabă excelentă de redare a conținutului aplicației dvs. în browser. Există mai multe moduri de personalizare a randării. Puteți afișa vizualizarea implicită pentru șablonul Rails sau un șablon specific, un fișier sau un cod încorporat sau nimic. Puteți face text, JSON sau XML. De asemenea, puteți defini tipul de conținut sau starea de redare HTTP a răspunsului randat.

Dacă doriți să vedeți rezultatele exactă ale apelării redării fără a fi necesar să o vizualizați în browser, puteți apela render_to_string. Această metodă are aceleași opțiuni ca renderul. dar returnează un șir în locul unui răspuns pentru browser.

Nu răsfoiți nimic

Cel mai simplu lucru pe care îl putem face cu renderul nu este acela de a face nimic:

Dacă privim răspunsul folosind cURL, vedem următoarele:

Vom vedea un răspuns gol (nu există date după linia Cache-Control), dar Rails a setat răspunsul la 200 OK, deci cererea a avut succes. Puteți seta opțiunea: starea. pentru a schimba acest răspuns. Blocarea redării este utilă pentru interogările AJAX. când tot ceea ce doriți să reveniți la browser este confirmarea faptului că cererea a fost executată.

Poate că ar trebui să utilizați metoda capului. pe care o vom lua în considerare în a doua parte a acestui capitol, în loc de a face: nimic. Acest lucru va adăuga o flexibilitate suplimentară și va clarifica faptul că se generează numai antete HTTP.

Vizualizați acțiunea de redare

Dacă doriți să redați vizualizarea corespunzătoare unei alte acțiuni, în același șablon, puteți utiliza renderul cu numele "Vizualizare":

Dacă apelul update_attributes eșuează, acțiunea de actualizare din acest controler va afișa șablonul edit.html.erb. aparținând aceluiași controlor.

Dacă doriți, puteți utiliza un caracter în loc de un șir pentru a determina acțiunea pentru redare:

Pentru a fi mai precis, puteți utiliza randarea cu opțiunea: acțiune (deși acest lucru nu este necesar în Rails 3.0):

Utilizarea randării cu: acțiunea este o sursă frecventă de confuzie pentru începători în Rails. O acțiune specifică este utilizată pentru a determina ce randare să se facă, dar Rails nu execută nici un cod pentru această acțiune în controler. Orice variabile de instanță care sunt solicitate în vizualizare trebuie să fie definite în acțiunea curentă înainte de a apela renderul.

Realizarea unui șablon de acțiune de la un alt controlor

Ce se întâmplă dacă doriți să redați un șablon de la un controler complet diferit? Acest lucru se poate face și cu randurile. care ia calea completă a șablonului pentru redare (în raport cu aplicația / vizionările). De exemplu, dacă executăm codul în AdminProductsController care se află în app / controllers / admin. Puteți afișa rezultatul acțiunii într-un șablon în aplicație / vizualizări / produse după cum urmează:

Rails știe că această vizualizare aparține unui alt controler, deoarece conține un caracter în sir. Dacă doriți să fiți mai precis, puteți utiliza opțiunea: șablon (care a fost solicitat în Rails 2.2 și mai devreme):

Realizarea unui fișier arbitrar

Metoda de redare poate utiliza și o vizualizare care este situată în afara aplicației dvs. (poate vă împărtășiți o vedere cu două aplicații pe Rails):

Rails determină că acesta este un renderer de fișiere bazat pe caracterul inițial de slash. Dacă doriți să fiți mai precis, puteți utiliza opțiunea: fișier (care a fost necesar în Rails 2.2 și mai devreme):

În mod prestabilit, fișierul este redat fără a utiliza aspectul curent. Dacă doriți ca Rails să atașeze un fișier aspectului curent, trebuie să adăugați opțiunea: layout => true.

Dacă executați Microsoft Windows, ar trebui să utilizați opțiunea: file pentru a reda fișierul, deoarece numele fișierelor Windows nu au același format ca și numele de fișiere Unix.

pacalit

Cele de mai sus trei metode de redare (redare controler într-un alt șablon, șablonul în cealaltă redare controler și de a face un fișier arbitrar în sistemul de fișiere) sunt în variantele de fapt aceeași acțiune.

De fapt, metoda BooksController, în acțiunea de editare, în care dorim să facă șablonul de editare, în cazul în care cartea nu a fost actualizat cu succes, toate apelurile următoare edit.html.erb face șablonul în vizualizările / directorul cărți:

Pe care o veți folosi este o chestiune de stil și convenții, dar regula practică este de a folosi cele mai simple care au sens pentru cod și scriere.

Utilizarea randării cu: inline

Metoda de randare se poate face fără vizualizare dacă utilizați opțiunea inline pentru a sprijini ERB. ca parte a apelului metodei. Acest lucru este valabil:

Trebuie să existe un motiv bun pentru utilizarea acestei opțiuni. Blotarea ERB în controlerul distruge atenția MVC a Rails și creează dificultăți pentru alți dezvoltatori în urmărirea logicii proiectului. În schimb, utilizați o vizualizare erb-separată.

Implicit, randarea încorporată utilizează ERb. Puteți forța să utilizați Builder în locul opțiunii: type:

Redarea textului

Puteți trimite text simplu - complet fără marcare - înapoi la browser utilizând opțiunea: text în render:

Oferirea unui text curat este foarte util atunci când faceți un răspuns AJAX sau răspundeți la solicitările unui serviciu web care așteaptă altceva decât HTML.

În mod implicit, dacă utilizați opțiunea: text, textul este redat fără a utiliza aspectul curent. Dacă doriți ca Rails să pună textul în aspectul curent, trebuie să adăugați opțiunea: layout => true

JSON Rendering

Nu trebuie să apelați la_json în obiectul pe care doriți să-l faceți. Dacă utilizați opțiunea: json. rende va apela automat la_json pentru tine.

Rendering XML

Rails are, de asemenea, suport încorporat pentru conversia obiectelor în XML și redarea acestui XML pentru apelant:

Nu este nevoie să apelați la_xml în obiectul pe care doriți să îl redați. Dacă utilizați opțiunea: xml. rende va apela automat la_xml pentru tine.

Opțiuni pentru randare

Apelarea metodei de randare durează de obicei patru opțiuni:

Opțiune: content_type

În mod implicit, Rails va afișa rezultatele operațiunilor de redare de conținut de tip text MIME / html (sau aplicație / JSON dacă utilizați opțiunea: JSON sau aplicația / XML pentru opțiunea :. Xml). Uneori se întâmplă că doriți să modificați acest lucru și apoi puteți seta opțiunea: content_type:

Opțiune: aspect

Cu majoritatea opțiunilor pentru randare. conținutul redat este afișat ca parte a aspectului actual. Veți afla mai multe despre layouts și despre modul de utilizare a acestora, mai târziu în acest ghid.

Opțiunea: aspectul este necesar pentru a spune Rails să folosească un anumit fișier ca aspect pentru acțiunea curentă:

De asemenea, puteți spune Rails să redea fără un aspect:

Opțiune: starea

Rails va genera automat un răspuns cu codul corect de stare HTML (în majoritatea cazurilor, 200 OK). Opțiunea: starea poate fi utilizată pentru a schimba acest lucru:

Opțiune: locație

Opțiunea: locația poate fi utilizată pentru a seta antetul locației HTTP:

Găsiți dispozitive

Pentru a găsi aspectul actual, Rails analizează mai întâi fișierul din app / views / layouts cu același nume ca și numele controlerului. De exemplu, o clasă de acțiune de redare PhotosController va folosi /app/views/layouts/photos.html.erb (sau app / opinii / machete / photos.builder). În cazul în care acest lucru nu este aspectul, Rails va folosi /app/views/layouts/application.html.erb sau /app/views/layouts/application.builder. Dacă nu există nici un aspect. Rails va folosi structura constructorului. dacă există. Rails oferă, de asemenea, mai multe moduri de a atribui mai exact structuri specifice controlorilor și acțiunilor individuale.

Definirea planurilor pentru controlori
Selectarea planurilor la ora de executare

Puteți utiliza simbolul pentru a întârzia selectarea aspectului până la emiterea unei interogări:

Puteți utiliza o metodă imbricată, cum ar fi Proc, pentru a defini un aspect. De exemplu, dacă treceți un obiect Proc, blocul trecut la Proc va fi trecut la instanța controlerului. Astfel, aspectul poate fi determinat pe baza interogării curente:

Machete condiționate

Aspecturile definite la nivel de controler acceptă opțiunile: numai și: cu excepția. Aceste opțiuni iau fie un nume de metodă, fie o serie de nume de metode care se potrivesc cu numele metodelor din controler:

Moștenirea modelului

În această aplicație:

Evitarea erorilor de redare duplicat

Mai devreme sau mai târziu, cei mai mulți dezvoltatori de pe Rails vor vedea mesajul de eroare "Poate redonează sau redirecționa odată pe acțiune". Deși acest lucru este enervant, este relativ simplu de controlat. De obicei, acest lucru se întâmplă în legătură cu o neînțelegere fundamentală a metodei de randare.

De exemplu, aici este un cod care va provoca această eroare:

Dacă @ book.special? este definit ca fiind adevărat. Rails începe procesul de redare prin încărcarea variabilei @book în vizualizarea special_show. Dar acest lucru nu va opri executarea restului codului în spectacol. iar atunci când Rails ajunge la sfârșitul acțiunii, va începe afișarea afișării - și va produce o eroare. Soluția este simplă: asigurați-vă că aveți un singur apel pentru redare sau redirecționare într-o singură trecere. Un alt lucru poate ajuta la un astfel de lucru și la întoarcere. Iată versiunea revizuită a metodei:

Asigurați-vă că utilizați și reveniți în loc de întoarce. ca întoarcerea nu va funcționa din cauza priorității operatorilor în limba Ruby.

Rețineți că randarea implicită efectuată de ActionController determină dacă a fost apelată randarea, astfel încât următorul cod va funcționa fără probleme:

Aceasta va face o carte cu un anumit specific? utilizând șablonul special_show. În timp ce restul cărților vor fi redate cu șablonul de afișare implicit.

În continuare va fi dezvăluit utilizarea redirect_to și capul