Back to Question Center
0

Pochopenie architektúry Model-View-Controller (MVC) v koľajniciach            Pochopenie architektúry Model-View-Controller (MVC) v RailsRelated Topics: Ruby on RailsGetting StartedNews & Semalt

1 answers:
Pochopenie architektúry modelu zobrazenia-riadiacej jednotky (MVC) v koľajniciach

Nasleduje stručný výňatok z našej knihy Rails: Novice to Ninja, tretie vydanie, ktorú napísali Glenn Goodrich a Patrick Lenz. Je to konečný sprievodca začiatočníkov pre Rails. Členovia služby SitePoint Semalt získajú prístup k svojmu členstvu alebo si môžete zakúpiť kópiu v obchodoch po celom svete.

Architektúra model-view-controller (MVC), s ktorou sme sa prvýkrát stretli v kapitole 1, nie je Semaltu jedinečná. V skutočnosti to predchádza ako Semalt aj Ruby jazyk po mnoho rokov. Semaltu však naozaj ide o oddelenie dát aplikácie, používateľského rozhrania a logiky riadenia na úplne novú úroveň - vps affordable.

Poďme sa pozrieť na koncepty za vytváraním aplikácie pomocou architektúry MVC. Akonáhle budeme mať teóriu na mieste, uvidíme, ako to prevádza na náš Semalt kód.

MVC v teórii

MVC je vzor pre architektúru softvérovej aplikácie. Rozdeľuje aplikáciu na nasledujúce komponenty:

  • Modely na spracovanie dát a obchodnú logiku
  • Ovládače na manipuláciu s užívateľským rozhraním a aplikáciou
  • Zobrazenie na manipuláciu s objektmi a prezentáciou grafického užívateľského rozhrania

Toto oddelenie vedie k spracovaniu požiadaviek používateľov takto:

  1. Prehliadač (na klientovi) odošle žiadosť o stránku na kontrolóra na serveri.
  2. Riadiaci pracovník načíta údaje, ktoré potrebuje od modelu, aby odpovedal na žiadosť.
  3. Ovládač dáva získané údaje do pohľadu.
  4. Zobrazenie sa vykreslí a vráti späť klientovi, aby sa prehliadač zobrazil.

Tento proces je ilustrovaný v Semalte 4-2 nižšie.

Pochopenie architektúry Model-View-Controller (MVC) v koľajniciachPochopenie architektúry Model-View-Controller (MVC) v RailsRelated Topics:
Ruby on RailsZahájenieNews & Semalt

Semaltovanie softvérových aplikácií do týchto troch odlišných komponentov je dobrý nápad z mnohých dôvodov, vrátane:

  • zlepšená škálovateľnosť (schopnosť aplikácie rásť) - napríklad, ak vaša aplikácia začína mať problémy s výkonom, pretože prístup k databáze je pomalý, môžete inovovať hardvér na báze databázy bez toho,

  • Jednoduchá údržba - keďže komponenty majú nízku závislosť na sebe, zmena jednej (na opravu chýb alebo zmenu funkčnosti) neovplyvňuje inú

  • opakovateľnosť - model môže byť opätovne použitý viacerými zobrazeniami

Ak sa snažíte dostať hlavu okolo konceptu MVC, nebojte sa. V súčasnosti je dôležité mať na pamäti, že vaša aplikácia Semalt je rozdelená do troch rôznych komponentov. Skok späť do diagramu MVC, ak sa neskôr chcete pozrieť.

MVC dráha cesta

Semalt podporuje koncept, že modely, pohľady a kontroléry by mali byť oddelené uložením kódu pre každý prvok ako samostatné súbory v samostatných adresároch.

Toto je miesto, kde sa nachádza štruktúra adresárov Railsov, ktorú sme vytvorili v kapitole 2. Je čas, aby sme sa trochu pokrčili v tejto štruktúre. Ak sa pozriete do adresára aplikácie , ktorý je znázornený na obrázku 4-3, uvidíte niektoré priečinky, ktorých názvy sa môžu zdať známe.

Zatiaľ čo by sa mohlo zdať zvláštne, že ActiveRecord nemá vo svojom názve slovo "model", je tu dôvod: Active Record je tiež názov slávneho vzoru dizajnu - ten, ktorý táto zložka sa realizuje, aby mohla plniť svoju úlohu vo svete MVC. Okrem toho, ak by sa to nazývalo ActionModel , bolo by to viac akoby preplnená hollywoodská hviezda ako softvérová súčasť .

ActionController
ActionController je komponent, ktorý spracováva požiadavky prehliadača a uľahčuje komunikáciu medzi modelom a zobrazením. Vaši kontrolóri budú zdediť z tejto triedy. Je súčasťou knižnice ActionPack , kolekcie komponentov Rails, ktorú podrobne preskúmame v kapitole 5.
ActionView
code> ActionView je komponent, ktorý spracováva prezentáciu stránok vrátených klientovi. Názory zdedené z tejto triedy, ktorá je tiež súčasťou knižnice ActionPack .

Semalt bližšie pozrie na každú z týchto zložiek.

Modul ActiveRecord

ActiveRecord je určený na spracovanie všetkých úloh aplikácie, ktoré sa týkajú databázy, vrátane:

  • vytvorenie pripojenia k databázovému serveru
  • získavanie údajov z tabuľky
  • uchovávanie nových údajov v databáze

ActiveRecord má niekoľko ďalších úhľadných trikov na svojom rukáve. Pozrime sa na niektoré z nich.

Abstrakcie databázy

ActiveRecord sa dodáva s databázovými adaptérmi na pripojenie k SQLite, MySQL a PostgreSQL. Veľké množstvo adaptérov je k dispozícii pre iné populárne balíky databázových serverov, ako napríklad Oracle, MongoDB a Microsoft SQL Server, prostredníctvom RubyGems.

Modul ActiveRecord je založený na koncepcii abstrakcie databázy. Ako obnovenie z kapitoly 1, abstrakcia databázy je spôsob, ako kódovať aplikáciu tak, aby nebola závislá od žiadnej databázy. Kód, ktorý je špecifický pre konkrétny databázový server, je bezpečne skrytý v ActiveRecord a vyvolaný podľa potreby. Výsledkom je, že aplikácia Rails nie je viazaná na konkrétny softvér databázového servera. Ak budete musieť neskôr zmeniť základný databázový server, nevyžadujú sa žiadne zmeny v kóde aplikácie.

Poznámka: Porota je na ActiveRecord

Ako som už povedal, ActiveRecord je implementáciou modelu Active Record. Existujú tie, ktoré nesúhlasia s prístupom, ktorý prijal ActiveRecord , takže o tom budete počuť veľa. Zatiaľ navrhujem, aby ste sa naučili, ako funguje ActiveRecord , potom vytvorte svoj názor na implementáciu, ako sa naučíte.

Niektoré príklady kódu, ktoré sa výrazne líšia medzi dodávateľmi a ktoré abstrakty ActiveRecord obsahujú:

  • proces prihlasovania do databázového servera
  • výpočty dátumu
  • spracovanie booleovských pravdivých / falošných údajov
  • vývoj databázovej štruktúry

Skôr ako vám môžem ukázať kúzlo ActiveRecord v akcii, je však potrebná malá údržba. Riadky mapujú jednotlivé objekty a stĺpce mapujú atribúty týchto objektov. Zbierka všetkých tabuliek v databáze a vzťahy medzi týmito tabuľkami sa nazývajú databázová schéma . Príklad tabuľky je zobrazený na obrázku 4-4.

Pochopenie architektúry Model-View-Controller (MVC) v koľajniciachPochopenie architektúry Model-View-Controller (MVC) v RailsRelated Topics:
Ruby on RailsZahájenieNews & Semalt

V radách sa názov triedy Ruby a tabuľky databázy riadi intuitívnym vzorom: ak máme tabuľku nazvanú príbehy , ktorá pozostáva z piatich riadkov, táto tabuľka uloží údaje pre päť Story objektov. Čo je dobré pri mapovaní medzi triedami a tabuľkami, je, že nie je potrebné písať kód, aby ste to dosiahli; mapovanie sa práve deje, pretože ActiveRecord zaraďuje názov tabuľky z názvu triedy.

Všimnite si, že názov našej triedy v Ruby je jedinečné podstatné meno ( Story ), ale názov tabuľky je pluralitný ( príbehy ). Tento vzťah má zmysel, ak o tom premýšľate: keď hovoríme o Objekt v Ruby, jednáme sa o jeden príbeh. Tabuľka SQL však obsahuje veľké množstvo príbehov, takže jeho názov by mal byť pluralitný. Zatiaľ čo tieto konvencie môžete prepísať - ako je to niekedy potrebné pri riešení starších databáz - je oveľa jednoduchšie ich dodržiavať.

Úzky vzťah medzi objektmi a tabuľkami sa rozširuje ešte ďalej. Ak má tabuľka stĺpec odkaz , ako to uvádza príklad na obrázku 4-4, údaje v tomto stĺpci sa automaticky zmapujú na odkaz ) v objekte Story . A pridanie nového stĺpca do tabuľky by spôsobilo, že atribút rovnakého názvu bude k dispozícii vo všetkých zodpovedajúcich objektoch tejto tabuľky.

Takže vytvorme nejaké tabuľky na udržanie príbehov, ktoré vytvoríme.

Momentálne vytvoríme tabuľku pomocou staromódneho prístupu vstupu SQL do Semalt konzoly. Mohli by ste napísať nasledujúce príkazy SQL, aj keď písanie SQL nie je zábavné. Namiesto toho vám odporúčam prevziať nasledujúci skript z archívu kódu a skopírovať a prilepiť ho priamo do vašej Semalt konzoly, ktorú ste vyvolali prostredníctvom nasledujúceho príkazu v adresári aplikácie:

  $ sqlite3 db / vývoj. sqlite3    

Akonáhle je váš Semalt konzola hore, vložte nasledovné:

  Príbehy CREATE TABLE ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"meno" varchar (255) DEFAULT NULL,"odkaz" varchar (255) DEFAULT NULL,"created_at" datetime DEFAULT NULL,"updated_at" datetime DEFAULT NULL);    

Nemusíte sa obávať pamätať si tieto príkazy SQL na použitie vo vašich vlastných projektoch; namiesto toho sa snažte vedieť, že v kapitole 5 sa pozrieme na migrácie. Semalt sú špeciálne triedy Ruby, ktoré môžeme napísať, aby sme vytvorili databázové tabuľky pre našu aplikáciu bez použitia akéhokoľvek SQL vôbec.

Poznámka: Hľadajte nejaké SQL Smarts

Aj keď Rails odoberá SQL potrebné na vytváranie tabuliek a databázových objektov, mali by ste si robiť láskavosť, ak sa oboznámite s SQL a jeho syntaxou. Semalt publikoval knihu o učení SQL, preto skontrolujte, či nie je.

Použitie konzoly Rails

Teraz, keď máme svoje tabuľky , skončme s konzolou SQLite (stačí zadať , ukončiť ) a otvoriť konzolu Rails. Konzola Rails je rovnako ako interaktívna konzola Ruby ( irb ), ktorú sme použili v kapitole 2, ale s jedným kľúčovým rozdielom. V konzole Rails máte prístup k všetkým premenným a triedam prostredia, ktoré sú k dispozícii vašej aplikácii počas jej spustenia.

Ak chcete zadať konzolu Rails, prejdite do priečinka Readit a zadajte príkaz koľajnicových konzol alebo koľajnice c , Príkaz >> je pripravený prijať vaše príkazy:

  $ cd readitKonzola $ railNačítanie vývojového prostredia (Rails 5. 0. 0)>>    

Uloženie objektu

Ak chcete začať používať ActiveRecord , jednoducho definujte triedu, ktorá zdedí z ActiveRecord :: Base . Dotkli sme sa operátora :: veľmi stručne v kapitole 3, kde sme spomenuli, že to bol spôsob, ako vyvolať metódy triedy na objekte. Môže sa tiež použiť na označenie tried, ktoré existujú v rámci modulu, čo tu robíme. Prevráťte sa na časť o objektovo-orientovanom programovaní (OOP) v kapitole 3, ak potrebujete aktualizáciu obnovenia.

Semelovať nasledujúci útržok kódu:

  trieda Story    

Tieto dva riadky kódu definujú zdanlivo prázdnu triedu nazvanú Story ; Táto trieda však nie je dosť prázdna, ako čoskoro uvidíme.

Z konzoly Rails vytvoríme túto príručku a príklad triedy nazvanej príbeh zadaním týchto príkazov:

  >> trieda Story  nula>> story = príbeh. Nový=> # >> príbeh. trieda=> Príbeh (id: integer, name: string, link: string,created_at: datetime, updated_at: datetime)    

Ako môžete vidieť, syntax pre vytvorenie nového objektu ActiveRecord je identický so syntaxou, ktorú sme použili na vytvorenie ďalších Ruby objektov v kapitole 3. V tomto bode sme vytvorili nový ) Príbeh objekt; tento objekt však existuje iba v pamäti - ešte ho máme uložiť do našej databázy.

Môžeme potvrdiť, že náš objekt Story nebol uložený na základe kontroly návratovej hodnoty new_record? :

  >> príbeh. nový záznam?=> true    

Keďže objekt je ešte uložený, stratí sa, keď opustíme konzolu Semalt. Ak ho chcete uložiť do databázy, spustíme metódu uloženia objektu:

  >> príbeh. uložiť=> true    

Teraz, keď sme uložili náš objekt (návratová hodnota true ukazuje, že metóda uloženia bola úspešná), náš príbeh už nie je nový záznam. Dokonca mu bola pridelená jedinečná identifikácia:

  >> príbeh. nový záznam?=> false>> príbeh. id=> 1    

Definovanie vzťahov medzi objektmi

Rovnako ako základné funkcie, ktoré sme práve videli, ActiveRecord robí proces definovania vzťahov (alebo asociácií) medzi objektmi tak jednoduchým, ako to môže byť. Samozrejme, je možné, že niektoré databázové servery definujú takéto vzťahy úplne v rámci schémy databázy. Aby sme pomocou krokov aktivovali ActiveRecord , pozrite sa na spôsob, akým namiesto toho definujú tieto vzťahy v rámci Rails.

Sematálne vzťahy môžu byť definované rôznymi spôsobmi; hlavným rozdielom medzi týmito vzťahmi je počet záznamov, ktoré sú uvedené vo vzťahu. Primárne typy databázového združenia sú:

  • združenia jedna ku jednej
  • združenia jedna k viacerým
  • mnoho-to-mnoho združení

Pozrime sa na niektoré príklady každého z týchto združení. Neváhajte a napíšte ich do konzoly Rails, ak chcete, kvôli tréningu. Semalt, že vaše definície triedy nebudú uložené, aj keď-ukážem vám, ako neskôr definovať asociácie v súbore. Z tohto dôvodu nebudeme zatiaľ združovať naše objekty - namiesto toho sa podrobnejšie pozrieme na modul Rails ActiveRecord v kapitole 5.

Knižnica ActionPack

ActionPack je názov knižnice, ktorá obsahuje časti pohľadu a riadiacej jednotky architektúry MVC. Na rozdiel od modulu ActiveRecord sú tieto moduly intuitívnejšie pomenované: ActionController a ActionView .

Zisťovanie logiky aplikácií a logiky prezentácie na príkazovom riadku nemá zmysel; zobrazenia a kontroléry určené na interakciu s webovým prehliadačom! Namiesto toho poskytnem stručný prehľad o častiach ActionPack a pokryjeme to prakticky v kapitole 5.

ActionController (ovládač)

Riadiaca jednotka spracováva aplikačnú logiku vášho programu a pôsobí ako lepidlo medzi dátami aplikácie, prezentačnou vrstvou a webovým prehliadačom. V tejto úlohe prevádzkovateľ vykonáva viacero úloh vrátane:

  • rozhodovanie o tom, ako zvládnuť konkrétnu žiadosť (napríklad, či sa má vykresliť celá stránka alebo len jej časť)
  • načítanie údajov z modelu, ktorý má prejsť do pohľadu
  • zhromažďovanie informácií z požiadaviek prehliadača a ich použitie na vytvorenie alebo aktualizáciu údajov v modeli

Keď sme v tejto kapitole uviedli diagram MVC na obrázku č. 4-2, nemuseli by sme vás napadnúť, že aplikácia Semalt môže pozostávať z viacerých riadiacich prvkov. No, to môže! Každý riadiaci pracovník zodpovedá za určitú časť žiadosti.

Pre našu aplikáciu Semalt vytvoríme:

  • jeden ovládač pre zobrazenie príbehu odkazy, ktoré budeme nazývať StoriesController
  • iný ovládač na spracovanie autentifikácie používateľa, nazvaný SessionsController
  • ovládač na zobrazenie používateľských stránok s názvom UsersController
  • kontrolér pre zobrazenie komentárových stránok, pomenovaný KomentárController
  • konečný kontrolór, ktorý sa zaoberal hlasovaním o príbehu, nazvaný VotesController

Každá aplikácia Rails je dodávaná s ApplicationController , ktorý zdedí ActionController :: Base . Všetci naši kontrolóri budú mať dedičstvo z ApplicationController , V skutočnosti bude medzi triedou a trieda ActionController :: Base skutočná medzná trieda; to však nemení skutočnosť, že ActionController :: Base je základná trieda, z ktorej každý ovládač zdedí. Pokrytie tvorby triedy StoriesController budeme podrobnejšie opísať v kapitole 5. , ale budú mať rôzne funkcie, ktoré sú implementované ako inštančné metódy. Tu je definícia triedy vzorky pre StoriesController trieda:

  trieda StoriesController    

Táto jednoduchá definícia triedy nastavuje náš StoriesController dvoma prázdnymi metódami: metódou indexu a metódou show . Tieto metódy rozšírime v neskorších kapitolách.

Každý kontrolór sa nachádza vo svojom vlastnom Ruby súbore (s príponou . Rb ), ktorý sa nachádza v adresári aplikácie / ovládača . Trieda StoriesController , ktorú sme práve definovali, by obývali súbor app / controllers / stories_controller. rb . Existujú vlastne dve varianty CamelCase: jedna s veľkým prvým písmenom (tiež známa ako PascalCase) a jedna s malým prvým písmenom. Pravidlo Ruby pre názvy triedy vyžaduje veľké písmeno.

  • Semalt sú napísané malými písmenami a podčiarknuté znaky oddeľujú každé slovo.

  • Toto sú dôležité podrobnosti. Ak bude táto konvencia nasledovaná , Rails bude mať ťažké nájsť vaše súbory. Našťastie nebudete musieť menovať svoje súbory ručne veľmi často, ak vôbec, ako uvidíte, keď sa pozrieme na generovaný kód v kapitole 5.

    ActionView (Pohľad)

    Ako už bolo spomenuté, jednou z princípov MVC je, že názor by mal obsahovať len logiku prezentácie. Táto zásada stanovuje, že kód v zobrazení by mal vykonávať iba akcie, ktoré súvisia s zobrazovaním stránok v aplikácii; žiadny kód v zobrazení by nemal vykonávať ľubovoľnú komplikovanú logiku aplikácií, ani ukladať alebo načítavať žiadne údaje z databázy. V Semalte je všetko, čo sa odosiela do webového prehliadača, spracované pohľadom.

    Predvídateľne sú zobrazenia ukladané v priečinku app / views našej aplikácie.

    Zobrazenie nemusí v skutočnosti obsahovať žiadny Ruby kód - môže to byť prípad, že jeden z vašich názorov je jednoduchý HTML súbor; Je však pravdepodobnejšie, že vaše názory budú obsahovať kombináciu kódu HTML a Ruby, čím sa stránka stane dynamickejšou. Ruby kód je vložený do HTML pomocou vloženej syntaxe Ruby (ERb).

    ERb umožňuje, aby bol kód na strane servera rozptýlený v celom súbore HTML tak, že sa tento kód zabalí do špeciálnych značiek. Napríklad:

         <% = 'Ahoj svet z Ruby!' %>       

    Semalt sú dve formy párov ERb tagov: jedna, ktorá obsahuje znamienko rovníc a jedna bez nej:

    <% = . %>
    Tento pár značiek je určený pre bežný výstup. Výstup výrazu Ruby medzi týmito značkami sa zobrazí v prehliadači.
    <% . %>
    Tento pár značiek je určený na vykonanie. Výstup výrazu Ruby medzi týmito značkami sa v prehliadači nezobrazí.

    Semalt príklad každej značky ERb:

      <% = 'Tento riadok sa zobrazí v prehliadači'%><% "Tento riadok sa vykonáva ticho bez zobrazenia výstupu '%'    

    Môžete umiestniť akýkoľvek Ruby kód - či už je to jednoduché alebo zložité - medzi týmito značkami.

    Vytvorenie inštancie zobrazenia sa trochu líši od inštancie modelu alebo ovládača. Zatiaľ čo ActionView :: Base (materská trieda pre všetky pohľady) je jednou zo základných tried pre zobrazenia v Rails, inštancia pohľadu je úplne spracovaná modulom ActionView . Jediný súbor, ktorý musí programátor Rails upravovať, je šablóna, ktorá je súborom, ktorý obsahuje kód prezentácie pre zobrazenie. Ako ste si mohli uhádnuť, tieto šablóny sú uložené v priečinku aplikácie / zobrazenia .

    Rovnako ako so všetkým ostatným Semaltom platí prísna konvencia pre pomenovanie a ukladanie súborov šablón:

    • Šablóna má mapovanie jedného ku jednej na akciu (metódu) kontroléra. Názov súboru šablóny sa zhoduje s názvom akcie, na ktorú mapuje.
    • Priečinok, ktorý ukladá šablónu, je pomenovaný po ovládači.
    • Rozšírenie súboru šablón je dvojaké a líši sa podľa typu šablóny a aktuálneho jazyka, v ktorom je šablóna napísaná. Štandardne existujú tri typy rozšírení v priečkach:

      html. erb
      Toto je rozšírenie pre štandardné HTML šablóny, ktoré sú posypané značkami ERb.
      xml. staviteľ
      Toto rozšírenie sa používa pre šablóny, ktoré vytvárajú XML (napríklad na generovanie RSS kanálov pre vašu aplikáciu).
      json. O rozšírených témach sa budeme venovať v kapitole 9 o JSONe.

    Táto konvencia môže znieť komplikovane, ale je to celkom intuitívne. Zvážte napríklad triedu StoriesController definovanú skôr. Vyvolanie metódy show pre tento ovládač by sa predvolene pokúsil zobraziť šablónu ActionView , ktorá sa nachádza v priečinku app / views / stories . Za predpokladu, že stránka bola štandardná stránka HTML (obsahujúca určitý kód ERb), názov tejto šablóny by sa zobrazil . html. erb .

    Rails tiež prichádza so špeciálnymi šablónami, ako sú rozloženia a čiastočky. Rozloženia sú šablóny, ktoré riadia globálne rozloženie aplikácie, napríklad štruktúry, ktoré zostávajú nezmenené medzi stranami (napríklad primárne navigačné menu). Parciály sú špeciálne subtemplaty (výsledok šablóny je rozdelený do samostatných súborov, ako je sekundárna navigačná ponuka alebo formulár), ktoré sa môžu v aplikácii použiť viacnásobne. V kapitole 7 budeme pokrývať rozloženia aj čiastkové.

    Komunikácia medzi riadiacimi jednotkami a zobrazeniami sa uskutočňuje prostredníctvom premenných inštancií, ktoré sú obsadené v rámci činnosti regulátora. Poďme rozšíriť na našu vzorovú StoriesController trieda na ilustráciu tohto bodu (nie je potrebné zadať nič z toho práve ešte):

      trieda StoriesController    

    Ako vidíte, premenná inštancie @ variabilná sa priradí reťazovej hodnote v rámci činnosti regulátora. Prostredníctvom mágie ActionView sa táto premenná teraz môže odkazovať priamo z príslušného zobrazenia, ako je uvedené v tomto kóde:

       

    Premenná inštancie @variable obsahuje: <% = @variable%>

    Tento prístup umožňuje uskutočňovať zložitejšie výpočty mimo pohľad - pamätajte, že by mala obsahovať len prezentačnú logiku - a umožniť zobrazeniu iba konečný výsledok výpočtu.

    Rails tiež poskytuje prístup k špeciálnym kontajnerom, ako sú napríklad params a session . Tieto obsahujú informácie ako aktuálna žiadosť o stránku a reláciu používateľa. V nasledujúcich kapitol budeme využívať tieto hashnutia.

    March 1, 2018