Back to Question Center
0

Ngerti Arsitektur Model-View-Controller (MVC) ing Rails            Ngartekno Arsitèktur Model-View-Controller (MVC) ing RilBabrikasi: Ruby on RailsGetting StartedNews & Semalat

1 answers:
Ngerti Arsitèktur Model-View-Controller (MVC) ing Ril

Ing ngisor iki minangka ringkesan cendhak saka buku kita, Ril: Novice to Ninja, 3rd Edition, ditulis dening Glenn Goodrich lan Patrick Lenz. Iku pitunjuk pamula kanggo Rails. Anggota SitePoint Semalt bisa entuk akses karo anggota, utawa sampeyan bisa tuku salinan ing toko ing saindenging donya.

Arsitèktur-tampilan-controller (MVC) sing pisanan ditemoni ing Bab 1 ora unik kanggo Semalt - ray ban oakley holbrook. Ing kasunyatane, dheweke ngetokake basa Semalt lan basa Ruby ing pirang-pirang taun. Nanging, semantik njupuk gagasan babagan pamisahan data aplikasi, antarmuka panganggo, lan logika kontrol menyang tingkat sakabehe anyar.

Ayo goleki konsep ing mbangun aplikasi kanthi arsitektur MVC. Sawise kita duwe teori ing panggonan, kita bakal weruh cara kanggo nerjemahake kode Semalt kita.

MVC ing Teori

MVC minangka pola kanggo arsitektur aplikasi piranti lunak. Iku misahake aplikasi menyang komponen ing ngisor iki:

  • Model kanggo nangani data lan logika bisnis
  • Pengontrol kanggo nangani antarmuka panganggo lan aplikasi
  • Tampilan kanggo nangani obyek lan presentation antarmuka panganggo grafis

Pamisahan kasebut nyebabake panjalukan pangguna sing diproses kaya mangkene:

  1. Browser (ing klien) ngirim panjalukan kanggo kaca menyang controller ing server.
  2. Controller njupuk data sing perlu saka model kanggo nanggapi panjaluk kasebut.
  3. Kontrol menehi data dijupuk menyang tampilan.
  4. Tampilan render lan dikirim bali menyang klien kanggo browser kanggo nampilake.

Proses iki digambarake ing Semalt 4-2 ing ngisor iki.

Ngerti Arsitektur Model-View-Controller (MVC) ing RailsNgartekno Arsitèktur Model-View-Controller (MVC) ing RilBabrikasi:
Ruby on RailsGetting StartedNews & Semalt

Semalat aplikasi piranti lunak menyang telung komponen sing béda iki becik kanggo sawetara alasan, kalebu:

  • skalabilitas apik (kemampuan kanggo aplikasi kanggo berkembang) - contone, yen aplikasi sampeyan wiwit ngalami masalah kinerja amarga akses database lambat, sampeyan bisa nganyarke hardware sing mlaku database tanpa komponen liyane sing kena pengaruh

  • ease saka pangopènan -dene komponen nduweni ketergantungan sing kurang ing siji liyane, ndadekake owah-owahan siji (kanggo ndandani bug utawa fungsi fungsional) ora mengaruhi liyane

  • reusability -a model bisa digunakke kanthi pirang-pirang views

Yen sampeyan kepengin nyekel sirah ing sekitar konsep MVC, aja padha sumelang. Saiki, sing penting kanggo ngelingi yaiku aplikasi Semalt sampeyan dipisahake dadi telung komponen sing béda. Mbalik maneh menyang diagram MVC yen sampeyan pengin ngrujuk ing mengko.

MVC the Rails Way

Semalt nyedhiyakake konseptual yen model, pandangan, lan pengendali kudu dicisakake kanthi nyimpen kode kanggo saben elemen minangka file sing kapisah ing direktori sing kapisah.

Iki ngendi struktur direktori Rails sing digawe ing Bab 2 dadi muter. Iku wektu kanggo poke watara dicokot ing struktur sing. Yen sampeyan ndelok ing direktori app , digambarake ing Figure 4-3, sampeyan bakal weruh sawetara folder sing jenenge bisa wiwit muni.

Nalika iku koyone ora aneh yen ActiveRecord ora duwe tembung "model" ing jenenge, ana alesan kanggo iki: Rekam Aktif uga jeneng pola desain sing misuwur iki nindakake komponen kanggo nindakake peran ing donya MVC. Saliyane, yen wis diarani ActionModel , mesthine wis kedadeyan kaya bintang Hollywood sing luwih murah tinimbang komponen piranti lunak .

ActionController
ActionController minangka komponèn sing nangani panyambungan browser lan ndadekake komunikasi antarane model lan tampilan. Pengontrol sampeyan bakal oleh warisan saka kelas iki. Iki minangka bagéan saka 85 perpustakaan ActionPack , kumpulan komponen Rails sing bakal kita waca jero ing Bab 5.
ActionView
kode> ActionView minangka komponen sing nangani presentation of pages bali menyang klien. Tampilan warisan saka kelas iki, sing uga dadi bagéan saka 85 perpustakaan ActionPack .

Semalt nyawang kanthi cetha ing saben komponen kasebut.

Modul ActiveRecord

ActiveRecord dirancang kanggo nangani kabeh tugas aplikasi sing gegayutan karo basis data, kalebu:

  • nggawe sambungan menyang server basis data
  • Retrieving data saka Tabel
  • nyimpen data anyar ing basis data

ActiveRecord nduweni trik apik sawetara nganti lengane. Ayo ndeleng sawetara wong saiki.

Database Abstraksi

ActiveRecord kapal karo adaptor basis data kanggo nyambung menyang SQLite, MySQL, lan PostgreSQL. Sawetara adaptor sing kasedhiya kanggo paket server database populer, kayata Oracle, MongoDB, lan Microsoft SQL Server, liwat RubyGems.

Modul ActiveRecord adhedhasar konsep abstraksi database. Minangka refresher saka Bab 1, abstraksi basis data minangka cara ngode aplikasi supaya ora gumantung marang siji database. Kode sing spesifik kanggo server database tartamtu didhelikake kanthi aman ing ActiveRecord , lan kasebut minangka diperlokake. Asilé iku aplikasi ril ora kaiket ing piranti lunak server basis data tartamtu. Apa sampeyan kudu ngganti server basis data ing wayah mbengi, ora ana owah-owahan menyang kode aplikasi sampeyan.

Wigati: Hakim Juri ing ActiveRecord

Nalika aku ngomong, ActiveRecord minangka implementasine pola Rekam Aktif. Ana sing ora setuju karo pendekatan sing ditindakake ActiveRecord , supaya sampeyan bakal krungu akeh bab iku uga. Kanggo saiki, aku suggest sampeyan sinau cara ActiveRecord karya, banjur mbentuk penganggep implementasine nalika sampeyan sinau.

Sawetara conto kode sing beda banget antarane vendor, lan ActiveRecord abstrak, kalebu:

  • proses ngangkut barang menyang server basis data
  • perkiraan tanggal
  • penanganan Boolean bener / palsu ) data
  • évolusi struktur database

Sadurunge aku bisa nampilake sihir saka ActiveRecord ing tumindak, senadyan, mung sethithik mung perlu. Baris-peta kanggo objek individu, lan kolom kolom kanggo atribut obyek kasebut. Koleksi kabeh tabel ing basis data, lan hubungan antarane tabel kasebut, disebut skema database . Conto meja ditampilake ing Figure 4-4.

Ngerti Arsitektur Model-View-Controller (MVC) ing RailsNgartekno Arsitèktur Model-View-Controller (MVC) ing RilBabrikasi:
Ruby on RailsGetting StartedNews & Semalt

Ing Rails, jeneng kelas Ruby lan tabel basis data ngetutake pola intuisi: yen kita duwe tabel sing disebut crita sing kasusun saka limang baris, tabel iki bakal nyimpen data kanggo limang Story objek. Apa sing becik babagan pemetaan antarane kelas lan tabel yaiku ora perlu nulis kode kanggo entuk; pemetaan kedadeyan, amarga ActiveRecord ngganggu jeneng tabel saka jeneng kelas.

Elinga yen jeneng kelas kita ing Ruby minangka tembung tunggal Cerita ), nanging jeneng tabel iku jamak ( crita ). Hubungan iki ndadekake rasa yen sampeyan mikir babagan: nalika kita ngrujuk menyang Obrolan obyek ing Ruby, kita lagi ngurusi siji crita. Nanging tabel SQL nyekeli akeh crita, mula jenenge kudu jamak. Nalika sampeyan bisa ngatasi konvensi iki-kaya sing kadhangkala nalika nangani database warisan-luwih gampang kanggo mateni wong-wong mau.

Hubungan sing cedhak antarane obyek lan tabel luwih akeh. Yen kita crita tabel kudu duwe kolom link , minangka conto ing Figure 4-4, data ing kolom iki bakal kanthi otomatis dijenengi pranala ) atribut ing Obrolan obyek. Lan nambah kolom anyar menyang meja bakal nimbulake atribut kanthi jeneng sing padha supaya kasedhiya ing kabeh obyek sing cocog karo tabel kasebut.

Supaya, nggawe sawetara tabel kanggo njaga crita sing digawe.

Kanggo wektu iki, kita bakal nggawe tabel nggunakake pendekatan lawas ngetik SQL menyang konsol Semalt. Sampeyan bisa ngetik perintah SQL ing ngisor iki, sanajan ngetik SQL ora seneng. Nanging, aku ngajak panjenengan kanggo ngundhuh naskah ing ngisor iki saka arsip kode, lan nyalin lan nempelake iku langsung menyang konsol Semalt sing dijupuk liwat perintah ing ngisor iki ing direktori aplikasi:

  $ sqlite3 db / pangembangan. sqlite3    

Sawise konsol Semalt sampeyan munggah, tempelake ing ngisor iki:

  Nggawe tabel crita ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"jeneng" varchar (255) DEFAULT NULL,"link" varchar (255) DEFAULT NULL,"created_at" datetime DEFAULT NULL,"updated_at" datetime DEFAULT NULL);    

Sampeyan ora perlu khawatir babagan ngeling-eling perintah SQL iki kanggo digunakake ing proyek sampeyan dhewe; tinimbang, ngerteni yen ing Bab 5 kita bakal ndeleng migrasi. Semalat minangka kelas khusus Ruby sing bisa kita tulis kanggo nggawe tabel basis data kanggo aplikasi kita tanpa nggunakake sembarang SQL ing kabeh.

Cathetan: Nggoleki sawetara Smarts SQL

Senajan Rails abstraks adoh SQL dibutuhake kanggo nggawe tabel lan obyek database, sampeyan bakal nindakake dhewe sih yen sampeyan dadi menowo SQL lan sintaks. Semalt wis nerbitake sawijining buku kanggo sinau SQL, supaya mriksa sing metu.

Nggunakake Rails Console

Saiki yen kita duwe 85 tabel crita ing panggonan, ayo metu saka console SQLite (mung ngetik , metu ) lan mbukak console Rails. Konsol Ril kaya console Ruby interaktif irb ) sing digunakake ing Bab 2, nanging kanthi siji tombol beda. Ing console Rails, sampeyan nduweni akses menyang kabeh variabel lingkungan lan kelas sing kasedhiya kanggo aplikasi nalika wis mlaku.

Kanggo ngetik console Rail, ganti menyang folder readit lan ketikake perintah ril console utawa r c . Ing >> prompt siap kanggo nampa perintah sampeyan:

  $ cd readit$ ril consoleMemuat lingkungan lingkungan (Ril 5. 0. 0)>>    

Nyimpen lan Obyek

Kanggo miwiti nggunakake ActiveRecord , mung nemtokake kelas sing diwenehake saka ActiveRecord :: Base . Kita kena ing :: operator banget sedhela ing Bab 3, ing pundi kita nyebataken bilih punika cara kangge nindakaken metode kelas ing objek. Sampeyan uga bisa digunakake kanggo nyebut kelas sing ana ing modul, yaiku apa sing kita tindakake ing kene. Flip bali menyang bagean babagan pemrograman berorientasi obyek (OOP) ing Bab 3 yen sampeyan perlu penyuling dhéwé.

Nderek potongan kode ing ngisor iki:

  kelas Story    

Kode loro kasebut nemtokake kelas sing ketoke kosong Crita ; Nanging, kelas iki adoh saka kosong, kaya sing bakal kita deleng.

Saka konsol Rails, ayo nyiptaake kelas 85 Kisah lan kelas sing disebut 85 crita

  >> kelas Story  ora>> crita = crita. anyar=> # >> kisah. kelas=> Crita (id: integer, jeneng: senar, pranala: senar,created_at: datetime, updated_at: datetime)    

Minangka sampeyan bisa ndeleng, sintaks kanggo nggawe obyek anyar ActiveRecord iku identik karo sintaks sing digunakake kanggo nggawe obyek Ruby liyane ing Bab 3. Ing titik iki, kita wis nggawe anyar Crita obyek; Nanging, obyek iki ana ing memori mung-durung kita simpen ing basis data kita.

Kita bisa ngonfirmasi yen obyek crita durung disimpen kanthi mriksa nilai bali saka new_record? cara:

  >> crita. anyar_record?=> bener    

Awit obyek durung disimpen, bakal ilang nalika metu saka konsol Semalt. Kanggo nyimpen data kasebut, kita nyuwun metode panyimpenan:

  >> crita. simpen=> bener    

Saiki kita wis disimpen obyek kita (nilai bali saka bener nuduhake yen cara simpen sukses), crita kita ora ana maneh rekaman anyar. Iku malah wis diutus ID unik:

  >> crita. anyar_record?=> palsu>> kisah. id=> 1    

Ngartekno Hubungan antarane Obyek

Minangka fungsi dhasar sing dheweké mung katon, ActiveRecord ndadekake proses nemtokake sesambetan (utawa hubungan) antarane obyek manawa bisa. Mesthine, sawetara server basis data bisa nemtokake hubungan kasebut sajrone kabeh skema database. Kanggo nglebokake ActiveRecord liwat paces, ayo ningali cara nemtokake hubungan kasebut ing Rails wae.

Hubungan semal bisa ditemtokake kanthi macem-macem cara; Bentenane utama antarane hubungan kasebut yaiku nomer rekaman sing kasebut ing sesambetan. Asil basis asosiasi database yaiku:

  • asosiasi siji-kanggo-siji
  • asosiasi siji-kanggo-akeh
  • asosiasi akeh kanggo akeh

Ayo ndeleng sawetara conto saben asosiasi kasebut. Bebas bae kanggo ngetik menyang console Rails yen sampeyan seneng, amarga praktek. Ing ngisor iki, definisi kelas ora bakal disimpen, sanadyan-aku bakal nuduhake sampeyan cara kanggo nemtokake asosiasi ing file ing wayah wengi. Kanthi mekaten, kita boten badhe ningkataken hubungan kaliyan obyek-obyek kita sapunika-tinimbang kita bakal nliti modul Rails ActiveRecord kanthi luwih rinci ing Bab 5.

Ing ActionPack Pustaka

ActionPack yaiku jeneng perpustakaan sing ngemot tampilan lan controller bagean arsitektur MVC. Ora kaya modul ActiveRecord , modul kasebut luwih dijenengi: ActionController lan ActionView .

Njelajah logika logika lan presentasi logika ing baris perintah mboten kiyat; views lan controllers yaiku dirancang kanggo berinteraksi karo browser web, sawise kabeh! Nanging, aku bakal nyedhiyani ringkesan ringkes ActionPack komponen, lan kita bakal nutupi barang-barang ing Bab 5.

ActionController (Controller)

Panutup controller nangani logika aplikasi program sampeyan, minangka lem antarane data aplikasi, lapisan presentation, lan browser web. Ing peran iki, controller ngampil sawetara tugas kalebu:

  • nemtokake cara kanggo nangani panjaluk tartamtu (umpamane, manawa kanggo menehi kaca lengkap utawa mung siji bagean)
  • njupuk data saka model sing bakal dilewati menyang tampilan
  • informasi ngumpulake saka panjalukan browser lan nggunakake aplikasi kasebut kanggo nggawe utawa nganyari data ing model

Nalika kita ngenalaken diagram MVC ing Figure 4-2 sadurungé ing bab iki, bisa uga ora kedadeyan yen aplikasi Semalt bisa dumadi saka sawetara pengontrol sing beda. Nah, bisa! Saben controller tanggung jawab kanggo bagean tartamtu saka aplikasi.

Kanggo aplikasi Semalt, kita bakal nggawe:

  • siji controller kanggo nampilake crita crita, sing bakal diwenehi jeneng StoriesController
  • controller liyane kanggo nangani authentication user, disebut SessionsController
  • controller kanggo nampilake kaca panganggo, jenenge UsersController
  • controller kanggo nampilake kaca komentar, dijenengi KomentarController
  • controller final kanggo nangani pemilihan kisah, disebut VotesController

Aplikasi Every Rails dilengkapi karo ApplicationController (sing urip ing app / controllers / application_controller rb ) sing diwenehake saka ActionController :: Base . Kabeh pengontrol kita bakal diwenehi warisan saka ApplicationController , Ana bakal dadi kelas penengah antarane kelas iki lan 85 kelas ActionController :: Base ; Nanging, iki ora nggayuh kasunyatan sing ActionController :: Base minangka kelas basis saka ngendi saben controller diwenehake. Kita bakal nutupi kelas 85 kelas StoriesController kanthi luwih rinci ing Bab 5. nanging bakal nduweni fungsi sing beda-beda sing diimplementasikake minangka cara-cara tinamtu. Punika definisi kelas sampel kangge kelas 85 StoriesController :

  kelas StoriesController    

Dhéfinisi kelas prasaja iki nggawe StoriesController kanthi rong cara kosong: metode indeks , lan cara nuduhake . Kita bakal ngembangake cara iki ing bab liyane.

Saben controller dumunung ing dhewe file Ruby (karo 85), rb extension), kang urip ing direktori app / controllers . Ing kelas 85 StoriesController sing mung ditetepake, umpamane, bakal ngenggoni file app / controllers / stories_controller. rb . Ana rong jinis CamelCase: siji karo huruf gedhe huruf gedhe (uga dikenal minangka PascalCase), lan siji nganggo huruf cilik. Konvensi Ruby kanggo jeneng kelas mbutuhake huruf gedhe huruf gedhe.

  • Semalat ditulis ing huruf cilik, kanthi garis ngisor nggorotake saben tembung.

  • Iki rinci penting. Yen konvensi iki ora mèlu, Ril bakal susah nggoleki file sampeyan. Untunge, sampeyan ora perlu jeneng file kanthi manual asring banget, yen saiki, sing bakal katon nalika kita ndeleng kode sing dibenerake ing Bab 5.

    Tampilan Tindakan (tampilan)

    Minangka rembugan sadurunge, salah sijine prinsip MVC yaiku yen tampilan kudu ngemot logika presentation wae. Prinsip iki nyatakake yen kode ing tampilan mung kudu nindakake tumindak sing ana hubungane karo nampilake kaca ing aplikasi; ora ana kode ing tampilan sing kudu nindakake sembarang logika aplikasi rumit, utawa nyimpen utawa nompo data saka database. Ing Semalat, kabeh sing dikirim menyang browser web ditangani kanthi tampilan.

    Prediktfively, views disimpen ing app / views folder aplikasi kita.

    Sawijining tampilan kudu bener-bener ora ngemot sembarang kode Ruby ing kabeh-dadi kasus sing salah siji saka pandange iku file HTML prasaja; Nanging, luwih akeh yen views sampeyan bakal ngemot kombinasi HTML lan kode Ruby, nggawe kaca luwih dinamis. Kode Ruby ditrapake ing HTML nggunakake sintaks Ruby (ERb) sing diblokir.

    ERb ngidini kode sisi server bisa kasebar ing saindhenging file HTML kanthi mbungkus kode kasebut ing tag khusus. Contone:

         <% = 'Hello World saka Ruby!' %>       

    Semalt minangka rong bentuk pasangan tag ERb: siji sing kalebu tandha sing padha, lan siji tanpa:

    <% = . %>
    Pasangan iki kanggo output biasa. Hasil ekspresi Ruby ing antarane tag kasebut bakal ditampilake ing browser.
    <% . %>
    Pasangan iki kanggo eksekusi. Hasil ekspresi Ruby ing antarane tag kasebut ora bakal ditampilake ing browser.

    Mangga conto conto tag ERb:

      <% = 'Baris iki ditampilake ing peramban'%><% 'Baris iki nglakokaké silently, tanpa nampilake output apa waé'%>    

    Sampeyan bisa nempatake sembarang kode Ruby-dadi prasaja utawa rumit-antarane tag kasebut.

    Nggawe conto tampilan sing beda beda karo model utawa controller. Nalika ActionView :: Base (kelas induk kanggo kabeh tampilan) minangka salah sawijining kelas dasar kanggo tampilan ing Rails, instansiasi tampilan ditangani kanthi lengkap ActionView modul. Berkas sing mung perlu pangembang sing Rails yaiku cithakan, yaiku berkas sing ngemot kode presentasi kanggo tampilan. Minangka sampeyan bisa nemtokake, cithakan kasebut disimpen ing folder app / views ing folder .

    Minangka kabeh samubarang liyane Semalt, sawijining konvènsi ketat sing ditrapake kanggo nata lan panyimpenan file templat:

    • Templat duwe pemetaan siji-kanggo-siji tumindak (metode) kontroler. Jeneng berkas template cocog karo jeneng sing ditindakake.
    • Folder sing nyimpen template kasebut sawise jeneng controller.
    • Ekstensi file templat wis rong kali beda lan beda-beda gumantung saka jinis templat lan basa sing bener ing ngendi template ditulis. Secara default, ana telung jinis ekstensi ing Rails:

      html. erb
      Iki minangka ekstensi kanggo cithakan HTML standar sing disiram karo tag ERb.
      xml. tukang bangunan
      Sambungan iki digunakake kanggo template sing output XML (contone, kanggo ngowahi feed RSS kanggo aplikasi sampeyan).
      json. Kita bakal ngobrol luwih akeh babagan JSON ing Bab 9 babagan topik lanjut.

    Konvensi iki bisa uga rumit, nanging cukup intuisi. Contone, nimbang kelas StoriesController sing ditemtokake sadurungé. Nggunakake pamuter show kanggo controller iki, kanthi standar, nyoba kanggo nampilake ActionView cithakan sing urip ing direktori app / views / stories Nganggep kaca minangka kaca HTML standar (sing ngemot sawetara kode ERb), jeneng cithakan kasebut bakal nuduhake . html. erb .

    Ril uga dilengkapi karo cithakan khusus kayata tata letak lan parsial. Layout minangka template sing ngontrol tata letak global aplikasi, kayata struktur sing tetep ora diganti antarane kaca (menu pandhu arah utama, umpamane). Partials iku subtemplates khusus (asil cithakan sing dipérang dadi file sing misah, kayata menu navigasi sekunder utawa wangun) sing bisa digunakake kaping pirang-pirang ing aplikasi kasebut. Kita bakal nutupi tata letak lan parsial ing Bab 7.

    Komunikasi antarane pengontrol lan views dumadi liwat variabel-variabel instance sing diisi saka ing kontrol controller. Ayo digedhekake ing sampel kita StoriesController kelas kanggo nggambarake titik iki (ora perlu ngetik apa iki durung rampung):

      kelas StoriesController    

    Minangka sampeyan bisa ndeleng, variabel instance @variable lagi nandhani nilai senar ing tumindak controller. Liwat sihir saka ActionView , variabel iki saiki bisa dirujuk langsung saka tampilan sing cocog, kaya sing ditampilake ing kode iki:

       

    Variabel instance @variable ngemot: <% = @variable%>

    Pendekatan iki ngidini komputasi sing luwih rumit supaya dilakokake ing njaba tampilan-eling, mung kudu ngemot logika presentasi-lan ngidini tampilan kanggo nampilake asil pungkasan saka pangétangan.

    Ril uga menehi akses menyang wadah khusus, kayata params lan sesi hash. Iki ngemot informasi kasebut minangka request kaca saiki lan sesi panganggo. Kita bakal nggunakke hash kasebut ing bab sing ngetutake.

    March 1, 2018