10 leggyakoribb hibákat Ruby on Rails legjobb gyakorlati bemutató, stúdió Michael Kechinova

Otthon 10 leggyakoribb hibák a Ruby on Rails: legjobb gyakorlati bemutató

Ruby on Rails (vagy csak „Rails”) - egy népszerű opensorsny keretrendszer alapján a Ruby programozási nyelv, amely hajlamos az irányadók, és egyszerűsödnek a webes fejlesztési folyamat.

Sínek épül elve a konfiguráció a megállapodást. Leegyszerűsítve ez azt jelenti, hogy alapértelmezés szerint Rails azt feltételezi, hogy a professzionális fejlesztők követi a „standard” legjobb gyakorlatok (például név, kód szerkezetét, és így tovább), és ha igen, akkor fog működni „automatikusan és mágikusan” anélkül, hogy tisztázni kell valamit. Ez a paradigma megvannak az előnyei, de nem nélkülözi a buktatókat. Különösen a „varázslat”, ami történik a színfalak mögött a keret, és néha vezethet fájdalom a csacsi, zavartság és a problémák, mint a „mi a fene folyik itt?”. De még lehet kívánatos következmények terén biztonságot és teljesítményt.

Ennek megfelelően, míg Rails könnyen kezelhető, az is könnyen elkészíthető problémákat. Ez a leírás áttekinti a 10 legnépszerűbb kérdések megmondja, hogyan lehet elkerülni őket, és megnevezni az okokat, amelyek arra késztetik őket.

10 leggyakoribb hibákat Ruby on Rails legjobb gyakorlati bemutató, stúdió Michael Kechinova

Hiba 1. Túl sok logika a vezérlő

Sínek alapul MVC-architektúra. A Rails közösség beszélünk kis és nagy modell a vezérlő, de az utóbbi években láttam egynél több kérelmet on Rails, amelyek megsértik ezt az elvet. Olyan egyszerű, hogy az összes prezentációs logika (ami a hely a helper) vagy logikumodeli a vezérlőn.

A probléma az, hogy a tárgy a vezérlő kezd megtörni az egységes felelősség elvének, így a jövőbeli változásokat kód összetett és hibára hajlamos. Általában az ilyen típusú logika, amely lehet a vezérlő:

Bár ez még mindig sérti az egységes felelősség elvének, ez a fajta minimum, amely megköveteli a keret síneket a vezérlő.

Hibát 2. Túl sok logika a

ERB, „dobozos” sablon motor Rails nyitó izgalmas lehetőségeket oldalak létrehozása, különböző tartalommal. Azonban, ha nem vigyázunk, akkor végül kap egy nagy fájlt, ami lesz vegyes HTML és Ruby-kódot, amelyet nehéz lesz kezelni, és hogy nehéz lesz fenntartani. Azt is vezethet, hogy a nagy számú ismétlés, amelynek hatására megsértését elveinek DRY (ne ismételje meg magát).


Üdvözöljük,
<% if current_user %>
<%= current_user.name %>
<% else %>
vendég
<% end %>

A legjobb módja annak, hogy megbirkózzon egy ilyen: győződjön meg arról, hogy az objektum által visszaadott CURRENT_USER mindig kiválasztása függetlenül attól, hogy valaki be van jelentkezve vagy sem, és hogy az megfelel a használt módszerek bemutatása ésszerű módon (nevezik null). Például megadhatjuk helper CURRENT_USER app / vezérlők / application_controller így:

require 'ostruct'
helper_method: CURRENT_USER

def CURRENT_USER
@current_user || = User.find munkamenet [: user_id], ha a munkamenet [: user_id]
ha @current_user
@current_user
más
OpenStruct.new (neve: 'Guest')
vég
vég

Ez helyettesíti a korábbi nézetet kód az egész egy sorban:

Üdvözöljük, <%= current_user.name -%>

Pár sínen további javaslatok:

  • Használja prezentáció sablonok és közös módszereket körülveszi a dolgok ismétlődnek az oldalain.
  • Felhasználási lakberendezők, mint például a Draper gem, hogy magukba prezentációs logika a Ruby-objektumot. Ezután felveheti módszerek az objektumot, hogy képviselje a logikai műveleteket, amelyek egyébként a nézet kódot.

Hibát 3. Túl sok logika a modell

Figyelembe véve azokat az ajánlásokat beszélt, hogy minimalizálja a logikát nézetek és vezérlők, az utolsó hely az MVC, ahol továbbra is a számunkra, hogy az összes logikai - ez a modell, nem igaz?

Sok Rails-fejlesztők valóban ezt a hibát, és végső soron az osztályokat ActiveRecord modell, ami a Mongo fájlok - nem csak sérti az egységes felelősség elvének, de egy rémálom technikai támogatást.

Ez a funkció, mint a generációs e-mail értesítést, a fellebbezés a külső szolgáltatásokat, az adatok átalakítása más formátumokba, és hasonlók nem teszik a ActiveRecord-modell, melynek célja - egy kicsit többet tegyenek, mint a keresési és tárolása az adatbázisban.

De ha ez a logika nem kell tartani, tekintettel a szabályozó és a modell - akkor hol?

Beszéljünk „öreg Ruby-objektumok” (Poros). Egy ilyen átfogó keret, mint a sínek, tapasztalatlan fejlesztők gyakran nem akarja, hogy saját osztályokat keretein kívül. Gyakran azonban a kiszabott logikai modellt Poros - ez az, amit az orvos rendelt elkerülése érdekében bonyolítja a modell. A Poros akkor magukba a dolgokat, mint az e-mail-értesítést, vagy kölcsönhatásba lépnek az API saját osztályokat, és ne tárolja őket ActiveRecord-modellben.

Tehát a fentiek alapján, az egyetlen logika, amely továbbra is a modell, akkor:

  • Konfiguráció ActiveRecord (például összekapcsolás és érvényesítés).
  • Egyszerű módszerek kapszulázó mutációk frissítéseket a paraméterek, és mentse őket az adatbázisban.
  • Access burkolókkal elrejteni belső információs modell (full_name módszert, amely kombinálja a mezőket first_name és last_name az adatbázisban).
  • Összetett lekérdezések (bonyolultabb, mint megtalálni). Általánosságban elmondható, hogy ne használja ezt a módszert, vagy bármely más módon alakítsuk ki sorban kívül modell osztály is.

4. Hiba lerakó általános osztályok kisegítő

Ez a hiba - valamilyen következménye hiba 3. Mint már említettük, a Rails keretrendszer összpontosít ezek a komponensek (például a modell, nézet és vezérlő) egy MVC keretrendszer. Van egy jó definíció fajta entitások osztályba tartoznak minden egyes ilyen elemek, de néha kell olyan módszerek, amelyek nem illenek a három közül.

Generátor Rail hozzon létre egy könyvtárat és egy új segítő osztály segítő. Ez lesz túl csábító kezdeni alkalmassága, hogy nem kell semmilyen modell, bármilyen képviselet vagy vezérlő.

Hiba 5. Ha túl sok drágaköveket

Ruby on Rails által támogatott gazdag ökoszisztéma hem, amelyek együttesen szinte minden lehetőséget, hogy csak egy fejlesztő gondolta volna. Ez nagyon hasznos, ha gyorsan összetett alkalmazások létrehozásáig, de én is láttam egy csomó alkalmazás, ahol a számos drágaköveket aránytalanul nagy, mint a rendelkezésre álló funkcionalitást.

Ez vezet néhány Rails problémákat. Visszaélés gemami mérete miatt Rails-folyamatok nagyobb a szükségesnél. Ez lassítja teljesítményt termelést. Amellett, hogy a felhasználói frusztrációt okozhat nagyobb mennyiségű szerver memória, ami növeli az üzemeltetési költségeket. Az is több időt vesz igénybe indít egy ilyen alkalmazás, amely lelassítja a folyamatot tervezése és így automatikus tesztelést lassú (és általában az ilyen tesztek futtatása ritkán).

Ne feledje, hogy minden gem, hogy csatlakozzon az alkalmazást, viszont attól függ, hogy más drágakövek, és ezek a többi, és így tovább. Hozzáadása drágaköveket lehet egy közös hatása. Például, hozzáadásával hem rails_admin adjunk még több mint 11 hem, amely 10% -kal több, mint sínek alap konfiguráció.

Abban az időben az írás friss Rails 4.1.0 Az eloszlás tartalmazza 43 hem Gemfile.lock fájlt. Ez egyértelműen több, mint a része a Gemfile és képviseli az összes gyöngyszemeket, melyek egy sor szabványos sínek drágaköveket hozzá függőségek.

6. figyelmen kívül hagyása hibanaplót

Míg a legtöbb Rails-fejlesztők tisztában vannak a rendelkezésre álló hitel-nemteljesítési naplófájlok a fejlesztés során, hogy nem sok figyelmet fordít az információt ezek a fájlok. Bár sok alkalmazás támaszkodik a felügyeleti eszköz naplók, mint például a New Relic Honeybadger vagy termelés, az is fontos, hogy figyelemmel kísérjék a naplók a folyamat során a fejlesztése és tesztelése egy alkalmazást.

Mint korábban említettük, ebben a leckét, a Rails keretrendszer teszi sok „mágikus”, különösen a modellek. Segítségével egyesületek nagyon könnyűvé teszi, hogy kapcsolatokat építsenek a táblák között, és szívja a nézetben. Minden SQL-kód automatikusan generálódik. De honnan tudod, hogy a generált SQL hatásos?

Egy példa, amit gyakran működik, az úgynevezett probléma lekérdezés N + 1. Abban az időben, mivel a probléma megoldódott, az egyetlen módja annak, hogy megtudja az oka annak előfordulása - lásd SQL-lekérdezéseket a naplók.

Aktív Rekord Rails lehetővé teszi, hogy jelentősen csökkenti a kérelmek száma, amely lehetővé teszi az összes kommunikációs tisztázni előre be kell tölteni. Ez úgy történik, amelyben az eljárás magában foglalja (vagy preload) a módszer az objektum Arel (ActiveRecord :: kapcsolat). C tartalmazza - ActiveRecord biztosítja, hogy minden a linkeket betöltésre kerül a minimális kérelmek száma, például:

A probléma megoldása az N + 1, ami a valóságban csak egy példa a számos elégtelenségek, akik élnek „a motorháztető alatt” az alkalmazás, ha nem sok figyelmet fordít rá. A következtetés ebből a szempontból az, hogy meg kell nézni a fejlesztő és testersky jelentkezzen a fejlesztés során - ellenőrizni (és javítjuk) hatástalanságát a kódot, amely az épület egy lekérdezést.

Felülvizsgálata naplók - egy jó módja annak, hogy keresse meg a nem hatékony kódot, és rögzítse az alkalmazás előtt megy a termelésbe. Ellenkező esetben, ha nem lehet biztos a termelékenységet a rendszerben, ameddig el nem kezd „élő” - valószínűleg az, hogy az adatbázist, amellyel korábban már dolgozott a fejlesztési és tesztelési, akkor sokkal kevesebb, mint amit lesz a termelési mód . Ha egy új alkalmazás, akkor is, ha az adatbázis a termelési módot kezdetben kis és minden rendben az első, akkor növekedni fog, és a probléma, hogy ebben a példában leírt, teszi a rendszer működését lassabb.
Ha úgy találja, hogy a naplók elakadt egy csomó felesleges információt amire szüksége van, akkor tisztítsa meg őket.

Hiba 7. hiánya automatizált tesztek

Ruby on Rails alapértelmezés szerint bőséges lehetőséget automatizált tesztelés. Sok a Rails-fejlesztők írja nagyon bonyolult vizsgálatok során TDD és a BDD-style, valamint a nagyobb teljesítményű vizsgálati keretek mellékelt gemah (rspec és uborka).

Miközben könnyű felvenni automatizált teszteket az alkalmazásban, én nagyon meglepődtem, amikor történt, hogy csatlakozzon a projekthez, ahol egyszerűen nem volt egyetlen írásbeli teszt (vagy legjobb esetben nagyon kevés). Abban az időben, mert lehetséges, hogy vitatkozni, hogy milyen vizsgálatok befogadónak kell lennie, meg kell állapítani, hogy legalább néhány automatizált teszteket kell jelen lennie minden alkalmazásban.

Az általános szabály az, hogy legalább egy magas szintű integrációt szöveg minden intézkedés a szabályozók. Egy bizonyos ponton a jövőben más fejlesztők szeretnék bővíteni vagy módosítani a kódot vagy proapgredit változata Ruby on Rails és a teszt-keretrendszer lehetővé teszi számukra, hogy az alapvető funkciókat az alkalmazás fut. További előny, hogy ez ad egy világos megértése jövőben a fejlesztők teljes körű alkalmazás funkcionalitását.

Hiba 8. Blocking hogy külső szolgáltatások

Harmadik fél által biztosított szolgáltatások Rails-szolgáltatások általában nagyon könnyen integrálható egy alkalmazást drágaköveket, amelyek az API-t. De mi történik, ha a külső szolgáltató kezd nem, vagy nagyon lassú?

Ne akadályozza az ilyen kérelmek helyett közvetlen utalás az alkalmazásban, meg kell, hogy átadják a háttérben, ha lehetséges. Néhány népszerű gyöngyszemeket:

Azokban az esetekben, amikor lehetetlen vagy kivitelezhetetlen át feldolgozása a háttérben, meg kell győződnie arról, hogy az alkalmazás elég jó kezeli a hibákat és hibák - ha a külső szolgáltatás „van”, vagy valamilyen probléma. Azt is meg kell, hogy teszteljék az alkalmazás anélkül, hogy külső szolgáltatások (esetleg eltávolításával futtató kiszolgálón az alkalmazás a hálózaton), hogy megbizonyosodjon arról, hogy ez nem vezet a nem kívánt következményeket.

Hiba 9. Férjhez meglévő adatbázis migrációk

A mechanizmus adatbázis migráció Rails lehetővé teszi, hogy parancsokat automatikusan hozzáadni vagy eltávolítani táblák és sorok. Mivel a fájlok, amelyek a migráció, elemzi a sorrendben, akkor játszani őket a kezdetektől, hogy egy üres adatbázist a faj az adatbázist a termelés. Tehát ez egy nagyszerű módja annak, hogy kezelni szemcsés változások az adatbázis sémában az alkalmazás érdekében, hogy elkerülhető legyen Rails.

Bár ez jól működik az elején a projekt, az idő múlásával, az adatbázis létrehozásának folyamata hosszabb időt vehet igénybe, és néha a migráció elveszett, ki a rossz sorrendben, vagy vett más Rails-t használó alkalmazások ugyanazon a szerveren.

Sínek létrehoz egy nézetet az aktuális rendszer db / schema.rb fájlt (ez az alapértelmezés), ami általában frissül, amikor a migráció indul. schema.rb fájlt hozhatunk létre akkor is, ha nincs áram a migráció révén a parancsot rake db: elrendezésben: dump. Gyakori hiba - nézd meg az új migrációs be repository, de nem frissíti schema.rb fájlt.

Amikor a vándorlás túl sokáig tart, a fejlesztők nem kell félni, hogy tisztítsa meg a régi könyvtárat migráció kiírási az új rendszer, és hogy továbbra is vele. Beállítása egy új fejlesztési környezetet igényel teljesítő rake db: séma: teher, ahelyett rake db: vándorolnak, amelyre a legtöbb fejlesztő.

Néhány ilyen kérdések is foglalkozik a kézikönyv on Rails.

10. Hibaellenőrzés bizalmas információkat a forráskód repository

Rails keretrendszer segítségével egyszerűen hozzon létre biztonságos alkalmazásokat véd sok típusú támadások. Valami, ami úgy érjük el, egy titkos token, amely lehetővé teszi a hozzáférést a böngésző munkamenetet. Még ha a token tárolja a config / secrets.yml. és a fájl beolvassa a token egy olyan környezetben, más, mint a termelési szerverek - a legújabb verzióját Rails token szerepel config / inicializáló / secret_token.rb. Ez a fájl gyakran tévesen szerepel az adattárban együtt a többi alkalmazás. Ha ez megtörténik, az egyetlen, aki hozzáfér a tároló, akkor férhetnek hozzá az alkalmazás számára.

Így, akkor biztosítania kell, hogy az adattár konfigurációs fájl (pl. Gitignore a git felhasználóknak) kizárási fájlt a token. Ezután az étel szerver képes lesz összegyűjteni a token egy olyan környezetben különbözik tőlük, illetve a mechanizmus, mint például az, amelyik szállít dotenv gem.

Sínek - egy erőteljes keretet, amely elrejti a sok kellemetlen részek kialakításához szükséges megbízható alkalmazásához. Bár Rails-alkalmazások sokkal gyorsabb, a tervezők kell figyelni, hogy az esetleges hibák a kódot, és konstrukció, amely biztosítja, hogy azok alkalmazása nagymértékben skálázható és könnyen karbantartható.

A fejlesztők is tisztában kell lenniük a problémák, amelyek miatt az alkalmazások lassabb, kevésbé megbízható és kevésbé biztonságos. Fontos, hogy megtanulják az alapokat a keret, és biztosítják, hogy teljes mértékben megértsék a építészet, design, kód - az egész fejlesztési folyamatot. Ez lehetővé teszi a minőségi alkalmazás nagy teljesítményű.