Rusrails létrehozása válaszok (első rész)

A szempontból a vezérlő három módja van, hogy hozzon létre egy HTTP-válasz:

Mi lesz nyilvánosságra mindegyik módszer viszont. De először egy kicsit az egyszerű dolgokat, lehet, hogy a vezérlő, hogy hozzon létre egy válasz: nem csinál semmit.

Alapértelmezett Rendering: megállapodás a konfiguráció akcióban

Azt hallottam, hogy Rails elősegíti az elv a „konvenció a konfiguráció”. Az alapértelmezett rendering - a tökéletes példája ennek. Alapértelmezésben a vezérlők Rails automatikusan teszi a nézet nevét, amelyek megfelelnek a műveletet. Például, ha van egy ilyen kódot a class BooksController:

És az azt követő, a routing fájlban:

És van vyuha fájl app / views / könyvek / index.html.erb:

Azonban ezt az üzenetet minimálisan segítőkész, és hamarosan létrehoz egy modellt könyv, és adjunk hozzá az index fellépés BooksController:

Ismét megjegyezzük, hogy van egy megállapodás fenti konfiguráció, hogy nincs felesleges tétele végén ezt a műveletet index. A szabály az, hogy nem kell valami feleslegessé végén a vezérlő akciójátékokat, sínek nézd action_name.html.erb sablon Vyuha módon vezérlő és lehetővé teszi majd, tehát ebben az esetben Rails lehetővé teszi majd a fájl app / views / könyvek / index.html .erb.

Tehát a mi Vyuha szeretnénk megjeleníteni a tulajdonságait az összes könyvet, ez használatával történik ERB sablon. hasonló a következő:

Tény, hogy a renderelés végezzük alosztályok ActionView :: TemplateHandlers. Nem megyünk bele a folyamatba, de fontos tudni, hogy az expanziós vyuha sablon fájlt ellenőrzi a processzor választás. Kezdve Rails 2, a standard kiterjesztés .erb az ERB (HTML beépített Ruby) és .builder Builder (XML generátor).

használata render

Sok esetben az eljárás ActionController :: Base # render végez remek munkát teszi az alkalmazás tartalma miatt használata a böngésző. Vannak különböző módon, hogy testre a renderelési beállításokat. Akkor teszi az alapértelmezett Vyuha Rails sablont, vagy egy bizonyos minta, vagy egy fájl vagy beágyazott kódot, vagy egyáltalán semmi. Akkor teszi a szöveget, JSON vagy XML. Azt is meghatározhatjuk, hogy milyen típusú tartalom vagy a kiolvasztott HTTP válasz állapotát.

Ha szeretné látni a pontos eredmények teszik a hívást anélkül, hogy nézd meg a böngésző okozhat render_to_string. Ez a módszer olyan lehetőség, mint a render. hanem visszatér egy string válasz a böngészőt.

Nem teszi a személyi

A legegyszerűbb dolog, amit tehetünk, hogy tegyék azt nem tehetik semmit:

Ha megnézzük a válasz, a cURL, lásd a következő:

Látjuk egy üres válasz (nincs adat után Cache-Control line), de Rails állított OK választ 200, így a kérés sikeres volt. Beállítható egy lehetőség: status. Megváltoztatni ezt a választ. Üres rendering hasznos AJAX kérések. ha minden, amit vissza akar térni a böngésző - ez igazolja, hogy a kérelmet.

Lehetséges, hogy használja a módszert fejét. akik úgy vélik, a második része ennek a fejezetnek, ahelyett, render: semmi. Ez ad nagyobb rugalmasságot és egyértelművé teszi, hogy csak a generált HTTP-fejléceket.

Rendering vyuha akciójátékok

Ha azt szeretnénk, hogy tegyék Vyuha szerint egy másik fellépés ugyanazt a sablont, akkor a vakolat nevű vyuha:

Ha a hívás sikertelen update_attributes, call frissítés akciójátékokat ebben vezérlő teszi edit.html.erb sablont. tulajdonosa ugyanaz a vezérlő.

Ha azt szeretnénk, akkor egy szimbólum helyett egy string, hogy meghatározzák a akciójátékokat tételére:

Hogy pontosak legyünk, akkor használja a lehetőséget, hogy render: action (bár ez nem szükséges Rails 3.0):

Using render: akció - gyakori zavarok forrása az újonnan érkezők Rails. Bizonyos lépéseket alkalmazunk, hogy melyik teszi a látványt, de Rails nem fut semmilyen kódot ehhez a művelethez a vezérlőben. Bármilyen például a változók, amelyek szükségesek a nézet, meg kell határozni a jelenlegi fellépés teszi a hívást.

Rendering akciójátékok egy másik vezérlő Template

Mi van, ha azt szeretnénk, hogy tegye egy sablont egy teljesen más vezérlő? Ezt is el lehet végezni a render. amely teljes mértékben útvonal mintája renderelés (relatív app / views). Például, ha futtatja a kódot AdminProductsController található app / vezérlők / admin. akciójátékokat tehetik az eredménye a sablon a app / views / termékek a következők:

Rails tudja, hogy ez vyuha tulajdonosa egy másik vezérlő, mert tartalmaz egy perjel karakterhez. Ha pontosak akarunk lenni, akkor használja ezt a beállítást: template (ami szükséges a Rails 2.2 és korábbi):

Rendering egy tetszőleges fájlt

render módszer is használható Vyuha, amely kívül esik az alkalmazás (talán megosztja vyuha két alkalmazás on Rails):

Rails megállapítja, hogy teszi a fájlt az eredeti perjel karakter. Ha azt szeretnénk, hogy pontosak legyünk, akkor használja ezt a beállítást: file (ami szükséges a Rails 2.2 és korábbi):

Alapértelmezett fájl kiolvasztott használata nélkül a jelenlegi elrendezést. Ha azt szeretnénk, Rails tenni a fájlt az aktuális elrendezés, hozzá kell adni a lehetőséget: layout => true.

Ha fut a Microsoft Windows, akkor kell használni a lehetőséget: fájl, hogy elvegye a fájlt, mert a Windows fájlnevek nem ugyanabban a formában, mint a Unix fájl nevét.

becsapott

A fenti három tevő eljárások (rendering vezérlő egy másik sablont, a sablon a többi rendering vezérlő és renderelő egy tetszőleges fájlt a fájlrendszerben) valójában variánsai ugyanazt a műveletet.

Tény, hogy az eljárás BooksController, a szerkesztési akció, amelyben szeretnénk, hogy elvegye a szerkesztés sablon, ha a könyv nem volt frissítése sikeresen megtörtént, a következő hívások edit.html.erb jeleníti meg a sablont views / könyvek könyvtárban:

Melyiket használja - ez a kérdés a stílus és a szabályok, de a szabály az, hogy használja a legegyszerűbb, ami teljesen érthető kódot, és írásban.

Használata render: inline

render eljárással tehet anélkül vyuha, ha használja a: inline, hogy támogassa a ERB. részeként a módszer hívás. Ez elég érvényesen:

Ott kell lennie egy jó ok arra, hogy használja ezt a lehetőséget. A felvétel ERB vezérlő megsérti az MVC orientációját Rails és megnehezíti a más fejlesztők logikáját követi a projekt. Ehelyett érdemes egy külön Erb-Vyuha.

Alapértelmezésben ez használ a beépített renderelés Erb. Akkor érvényesíteni használata helyett az építő lehetőség: típusa:

szöveg megjelenítés

Akkor küldje el a sima szöveget - egyáltalán nincs jelölés - vissza a böngésző segítségével a lehetőségek: text tétele:

Rendering tiszta szöveget a leghasznosabb, ha csinálsz AJAX válasz, vagy nem válaszol a webszolgáltatás kérések vár valami más, mint a HTML.

Alapértelmezésben, ha használja a lehetőséget: szöveg szöveg megjelenítésekor használata nélkül a jelenlegi elrendezést. Ha azt szeretnénk, Rails tenni a szöveget az aktuális elrendezés, hozzá kell adni a lehetőséget: layout => true

rendering JSON

To_json nem kell hívni a kívánt objektumot tétele. Ha az opciót használjuk: JSON. render automatikusan hívja to_json az Ön számára.

XML rendering

Korlátok is beépített támogatása konvertáló objektumok XML és renderelő, hogy az XML a hívónak:

To_xml nem kell hívni a kívánt objektumot tétele. Ha ezt a lehetőséget: xml. render automatikusan hívja to_xml az Ön számára.

Lehetőségek render

Render eljárás hívás rendszerint négy lehetőség közül:

Opció: content_type

Alapértelmezésben Rails megmutatja a műveletek eredményeit állatihulladék tartalom típus MIME text / html (vagy application / json, ha használja ezt a lehetőséget: JSON vagy application / xml opció :. XML). Néha előfordul, hogy szeretne változtatni, és akkor majd az opciót: content_type:

Opció: layout

A legtöbb lehetőség render. A megjelenített tartalom részeként jelennek meg a jelenlegi elrendezést. Lesz többet elrendezések és hogyan kell használni őket később ebben az útmutatóban.

Opció: layout kell mondani Rails használni bizonyos fájlt az elrendezés az aktuális akció játékok:

Azt is mondja Rails tétele nélkül elrendezés egyáltalán:

Opció: status

Sínek automatikusan létrehoz egy válasz a helyes HTML-kódot állapot (a legtöbb esetben megegyezik a 200 OK). Opció: állapot lehet használni, hogy ez megváltozzon:

Opció: elhelyezkedés

Opció: helyszín lehet használni, hogy állítsa be a HTTP Location header:

Keresés elrendezések

Ahhoz, hogy megtalálja az aktuális elrendezés, a síneket először néz a fájlban app / views / layouts névvel azonos a neve a vezérlő. Például, egy osztály a cselekvés teszi PhotosController fogja használni /app/views/layouts/photos.html.erb (vagy app / views / layouts / photos.builder). Ha nem ez az elrendezés, Rails fogja használni /app/views/layouts/application.html.erb vagy /app/views/layouts/application.builder. Ha nincs elrendezés .erb. Sínek fogja használni .builder elrendezést. ha van ilyen. Sínek számos módon, hogy pontosabban hozzá speciális elrendezés az egyes vezérlők és a cselekvés.

Meghatározó tagolást vezérlők
A választás az elrendezés futásidőben

Használhatja a szimbólumot, hogy elhalasztja a választott elrendezés mindaddig, amíg a kérelmet nem:

Akár azt is használja a beágyazott módszerrel, mint Proc, hogy meghatározzák az elrendezés. Például, ha adási Proc objektum, a blokk továbbított Proc, átvisszük a vezérlő példány. így az elrendezés alapján lehet meghatározni az aktuális kérés:

feltételes elrendezések

Elrendezések meghatározni az adatkezelő szintjén támogatási lehetőséget: kizárólag: kivéve. Ezek a lehetőségek, hogy akár egy eljárás neve vagy egy sor módszer megfelelő elnevezések a nevét módszerek a vezérlő:

öröklés elrendezés

Ebben az alkalmazásban:

Hibák elkerülése kétszeresen megfizetek

Előbb vagy utóbb, a legtöbb Rails fejlesztő esetén a hiba üzenet „Csak render vagy átirányítani egyszer akció”. Bár az ilyen bosszantó, ez egy viszonylag egyszerű szabályt. Általában ez annak köszönhető, hogy egy alapvető félreértés a működési módja render.

Például, itt van valami kód, ami okozhatja a hibát:

Ha a @ book.special? Ez a meghatározás szerint igaz. Korlátok rendering folyamat kezdődik, kirakodó @book változó a nézet special_show. De ez nem áll meg a végrehajtás a többi kódot a akciódús show. és amikor eléri a végén Rails akció, akkor kezdődik, hogy elvegye a nézet - és hibát generál. A megoldás egyszerű: győződjön meg arról, hogy csak egy hívás tétele vagy átirányítani egy menetben. Még segíthet olyan dolog, mint, és visszatér. Itt a javított változat a módszer:

Győződjön meg róla, hogy a használt és visszaút helyett visszatéréshez. mint visszatérés nem fog működni kapcsolatban a prioritás a szolgáltatók a nyelv Ruby.

Megjegyezzük, hogy az implicit render végre ActionController azt határozza meg, hogy okozott tehetik, így a következő kód működni fog gond nélkül:

Ez lehetővé teszi majd a könyvet a megadott különleges? via special_show sablont. míg a többi könyv fognak megjelenni az alapértelmezett sablon show.

A folytatása a használat kérdése lesz feltárta redirect_to és a fej