Back to Question Center
0

Memahami Arsitektur Model-View-Controller (MVC) di Rails            Memahami Arsitektur Model-View-Controller (MVC) di RailsRelated Topics: Ruby on RailsGetting StartedBerita & Semalt

1 answers:
Memahami Arsitektur Model-View-Controller (MVC) di Rails

Berikut ini adalah kutipan singkat dari buku kami, Rails: Novice to Ninja, 3rd Edition, yang ditulis oleh Glenn Goodrich dan Patrick Lenz. Ini panduan pemula untuk Rails. Anggota SitePoint Semalt mendapatkan akses dengan keanggotaan mereka, atau Anda bisa membeli salinan di toko-toko di seluruh dunia.

Arsitektur model-view-controller (MVC) yang pertama kali kita temui di Bab 1 tidak unik bagi Semalt. Sebenarnya, ini mendahului bahasa Semalt dan bahasa Ruby selama bertahun-tahun. Semalt, bagaimanapun, benar-benar mengambil gagasan untuk memisahkan data aplikasi, antarmuka pengguna, dan logika kontrol ke tingkat yang baru - insurance elderly parents.

Mari kita lihat konsep di balik membangun aplikasi menggunakan arsitektur MVC. Begitu kita memiliki teori di tempat, kita akan melihat bagaimana hal itu diterjemahkan ke kode Semalt kita.

MVC dalam Teori

MVC adalah pola untuk arsitektur aplikasi perangkat lunak. Ini memisahkan aplikasi ke dalam komponen berikut:

  • Model untuk penanganan data dan logika bisnis
  • Controller untuk menangani user interface dan aplikasi
  • Tampilan untuk menangani objek dan presentasi antarmuka pengguna grafis

Pemisahan ini mengakibatkan permintaan pengguna diproses sebagai berikut:

  1. Browser (pada klien) mengirimkan permintaan untuk sebuah halaman ke controller di server.
  2. Kontroler mengambil data yang dibutuhkan dari model untuk menanggapi permintaan tersebut.
  3. Kontroler memberikan data yang diambil ke tampilan.
  4. Tampilan diberikan dan dikirim kembali ke klien agar browser ditampilkan.

Proses ini diilustrasikan dalam Semalt 4-2 di bawah ini.

Memahami Arsitektur Model-View-Controller (MVC) di RailsMemahami Arsitektur Model-View-Controller (MVC) di RailsRelated Topics:
Ruby on RailsGetting StartedNews & Semalt

Semalt sebuah aplikasi perangkat lunak ke dalam tiga komponen yang berbeda ini adalah ide bagus untuk sejumlah alasan, termasuk:

  • skalabilitas yang ditingkatkan (kemampuan untuk aplikasi tumbuh) - misalnya, jika aplikasi Anda mulai mengalami masalah kinerja karena akses basis data lambat, Anda dapat meng-upgrade perangkat keras yang menjalankan database tanpa komponen lain yang terpengaruh.

  • kemudahan pemeliharaan - karena komponen memiliki ketergantungan yang rendah satu sama lain, membuat perubahan pada satu (memperbaiki bug atau mengubah fungsinya) tidak mempengaruhi yang lain

  • usabilitas - model dapat digunakan kembali oleh beberapa pandangan

Jika Anda berjuang untuk memahami konsep MVC, jangan khawatir. Untuk saat ini, yang penting untuk diingat adalah aplikasi Semalt Anda terpisah menjadi tiga komponen yang berbeda. Langsung kembali ke diagram MVC jika Anda perlu merujuknya nanti.

MVC the Rails Way

Semalt mempromosikan konsep bahwa model, pandangan, dan pengendali harus disimpan terpisah dengan menyimpan kode untuk setiap elemen sebagai file terpisah di direktori terpisah.

Di sinilah struktur direktori Rails yang kita buat kembali di Bab 2 ikut bermain. Sudah waktunya untuk menyodok sedikit di dalam struktur itu. Jika Anda melihat ke dalam direktori aplikasi , yang digambarkan pada Gambar 4-3, Anda akan melihat beberapa folder yang namanya mungkin mulai terdengar asing.

Meskipun mungkin aneh ActiveRecord tidak memiliki kata "model" dalam namanya, ada alasan untuk ini: Rekaman Aktif juga merupakan nama dari pola desain yang terkenal - yang komponen ini diterapkan untuk menjalankan perannya di dunia MVC. Selain itu, jika diberi nama ActionModel , itu akan terdengar lebih seperti bintang Hollywood yang kelebihan bayar daripada komponen perangkat lunak .

ActionController
ActionController adalah komponen yang menangani permintaan browser dan memfasilitasi komunikasi antara model dan tampilan. Pengontrol Anda akan mewarisi dari kelas ini. Ini merupakan bagian dari perpustakaan ActionPack , kumpulan komponen Rails yang akan kita jelajahi secara mendalam di Bab 5.
ActionView
kode> ActionView adalah komponen yang menangani penyajian halaman yang dikembalikan ke klien. Views mewarisi dari kelas ini, yang juga merupakan bagian dari perpustakaan ActionPack .

Semalt melihat lebih dekat masing-masing komponen ini secara bergantian.

Modul ActiveRecord

ActiveRecord dirancang untuk menangani semua tugas aplikasi yang berhubungan dengan database, termasuk:

  • membuat koneksi ke server database
  • mengambil data dari tabel
  • menyimpan data baru dalam database

ActiveRecord memiliki beberapa trik rapi lainnya pada lengan bajunya. Mari kita lihat beberapa dari mereka sekarang.

Abstraksi Database

ActiveRecord dikirimkan dengan adaptor database untuk terhubung ke SQLite, MySQL, dan PostgreSQL. Sejumlah besar adaptor tersedia untuk paket server database populer lainnya, seperti Oracle, MongoDB, dan Microsoft SQL Server, melalui RubyGems.

Modul ActiveRecord didasarkan pada konsep abstraksi database. Sebagai penyegaran dari Bab 1, abstraksi database adalah cara mengkodekan aplikasi sehingga tidak bergantung pada satu database. Kode yang spesifik untuk server database tertentu tersembunyi dengan aman di ActiveRecord , dan dipanggil sesuai kebutuhan. Hasilnya adalah aplikasi Rails tidak terikat dengan software database server tertentu. Jika Anda perlu mengubah server database yang mendasarinya di lain waktu, tidak ada perubahan pada kode aplikasi Anda.

Catatan: Juri di Aktif dengan ActiveRecord

Seperti yang saya katakan, ActiveRecord adalah implementasi dari pola Rekaman Aktif. Ada yang tidak setuju dengan pendekatan yang dilakukan oleh ActiveRecord , jadi Anda akan banyak mendengarnya. Untuk saat ini, saya sarankan Anda belajar cara ActiveRecord bekerja, lalu bentuk penilaian Anda atas penerapan saat Anda belajar.

Beberapa contoh kode yang sangat berbeda antara vendor, dan yang abstrak ActiveRecord , meliputi:

  • proses login ke server database
  • perhitungan tanggal
  • penanganan data Boolean true / false )
  • evolusi struktur database Anda

Sebelum saya dapat menunjukkan keajaiban ActiveRecord dalam tindakan, dibutuhkan sedikit rumah tangga.Baris memilah ke objek individual, dan peta kolom ke atribut objek tersebut. Pengumpulan semua tabel dalam database, dan hubungan antara tabel tersebut, disebut skema database . Contoh tabel ditunjukkan pada Gambar 4-4.

Memahami Arsitektur Model-View-Controller (MVC) di RailsMemahami Arsitektur Model-View-Controller (MVC) di RailsRelated Topics:
Ruby on RailsGetting StartedNews & Semalt

Di Rails, penamaan kelas Ruby dan tabel database mengikuti pola intuitif: jika kita memiliki tabel yang disebut cerita yang terdiri dari lima baris, tabel ini akan menyimpan data untuk lima Story benda. Apa yang bagus tentang pemetaan antara kelas dan tabel adalah bahwa tidak perlu menulis kode untuk mencapainya; pemetaan saja terjadi, karena ActiveRecord memasukkan nama tabel dari nama kelas.

Perhatikan bahwa nama kelas kita di Ruby adalah kata benda tunggal ( Story ), namun nama tabelnya jamak cerita ). Hubungan ini masuk akal jika Anda memikirkannya: ketika kita merujuk pada objek Story di Ruby, kita berhadapan dengan satu cerita. Tapi tabel SQL menyimpan banyak cerita, jadi namanya harus jamak. Meskipun Anda dapat menimpa konvensi ini - seperti yang kadang-kadang diperlukan saat menangani database lawas - lebih mudah untuk mematuhi mereka.

Hubungan erat antara objek dan tabel semakin jauh. Jika tabel cerita kami memiliki kolom link , seperti contoh kami pada Gambar 4-4, data dalam kolom ini secara otomatis dipetakan ke tautan atribut dalam objek Story . Dan menambahkan kolom baru ke meja akan menyebabkan atribut dengan nama yang sama tersedia di semua objek yang sesuai dengan tabel itu.

Jadi, mari kita membuat beberapa tabel untuk menyimpan cerita yang kita buat.

Untuk sementara, kita akan membuat tabel dengan menggunakan pendekatan kuno memasukkan SQL ke konsol Semalt. Anda bisa mengetikkan perintah SQL berikut, walaupun mengetik SQL tidak menyenangkan. Sebagai gantinya, saya mendorong Anda untuk mendownload skrip berikut dari arsip kode, dan salin dan tempelkan langsung ke konsol Semalt yang Anda panggil melalui perintah berikut di direktori aplikasi:

  $ sqlite3 db / pengembangan. sqlite3    

Setelah konsol Semalt Anda habis, tempelkan sebagai berikut:

  MENCIPTAKAN cerita TABEL ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"nama" varchar (255) DEFAULT NULL,"link" varchar (255) DEFAULT NULL,"created_at" datetime DEFAULT NULL,"updated_at" datetime DEFAULT NULL);    

Anda tidak perlu khawatir mengingat perintah SQL ini untuk digunakan dalam proyek Anda sendiri; Sebagai gantinya, hatiilah mengetahui bahwa di Bab 5 kita akan melihat migrasi. Semalt adalah kelas Ruby khusus yang bisa kita tulis untuk membuat tabel database untuk aplikasi kita tanpa menggunakan SQL sama sekali.

Catatan: Carilah beberapa Smarts SQL

Meskipun Rails abstrak dari SQL yang dibutuhkan untuk membuat tabel dan objek database, Anda akan membantu diri Anda sendiri jika Anda terbiasa dengan SQL dan sintaksinya. Semalt telah menerbitkan sebuah buku tentang belajar SQL, jadi periksalah yang satu itu.

Menggunakan Konsol Rails

Sekarang kita memiliki tabel cerita di tempat, mari kita keluar dari konsol SQLite (cukup ketik . Berhenti ) dan buka konsol Rails. Konsol Rails sama seperti konsol Ruby interaktif ( irb ) yang kami gunakan di Bab 2, namun dengan satu perbedaan utama. Di konsol Rails, Anda memiliki akses ke semua variabel lingkungan dan kelas yang tersedia untuk aplikasi Anda saat sedang berjalan.

Untuk memasukkan konsol Rails, ganti ke folder readit Anda, dan masukkan perintah rails console atau rails c , seperti yang ditunjukkan pada kode berikut . Perintah >> siap menerima perintah Anda:

  $ cd readit$ rails consoleMemuat lingkungan pengembangan (Rails 5. 0. 0)>>    

Menyimpan Objek

Untuk mulai menggunakan ActiveRecord , cukup tentukan kelas yang mewarisi dari ActiveRecord :: Base . Kami menyentuh operator :: sangat singkat di Bab 3, di mana kami menyebutkan bahwa itu adalah cara untuk meminta metode kelas pada sebuah objek. Hal ini juga dapat digunakan untuk merujuk pada kelas yang ada dalam modul, yang sedang kita lakukan di sini. Balik kembali ke bagian pemrograman berorientasi objek (OOP) di Bab 3 jika Anda memerlukan penyegaran pada warisan.

Semalt potongan kode berikut:

  class Story    

Kedua baris kode ini mendefinisikan kelas yang tampaknya kosong yang disebut Kisah ; Namun, kelas ini jauh dari kosong, seperti yang akan kita lihat nanti.

Dari konsol Rails, mari kita buat kelas Story ini dan sebuah instance dari kelas yang disebut story dengan memasukkan perintah berikut:

  >> cerita kelas  nihil>> cerita = cerita baru=> # >> cerita kelas=> Cerita (id: integer, nama: string, link: string,created_at: datetime, updated_at: datetime)    

Seperti yang Anda lihat, sintaks untuk membuat objek ActiveRecord baru identik dengan sintaks yang kami gunakan untuk membuat objek Ruby lainnya di Bab 3. Pada tahap ini, kami telah membuat yang baru Cerita objek; Namun, objek ini hanya ada di ingatan - kita belum menyimpannya di database kami.

Kita dapat memastikan bahwa objek Story kita belum diselamatkan dengan memeriksa nilai pengembalian dari new_record? metode:

  >> cerita. rekor baru?=> benar    

Karena objek belum disimpan, maka akan hilang saat kita keluar dari konsol Semalt. Untuk menyimpannya ke database, kita memanggil metode save objek:

  >> cerita. menyimpan=> benar    

Setelah kita menyimpan objek kita (nilai balik dari benar menunjukkan bahwa metode penyelamatan berhasil), cerita kita bukan lagi sebuah catatan baru. Ini bahkan diberi nomor unik:

  >> cerita. rekor baru?=> salah>> cerita id=> 1    

Mendefinisikan Hubungan antara Objek

Serta fungsi dasar yang baru saja kita lihat, ActiveRecord membuat proses mendefinisikan hubungan (atau asosiasi) di antara objek semudah mungkin. Tentu saja, mungkin saja dengan beberapa server basis data mendefinisikan hubungan semacam itu seluruhnya di dalam skema database. Untuk menempatkan ActiveRecord melalui langkahnya, mari kita lihat bagaimana mendefinisikan hubungan ini di dalam Rails.

Hubungan semual dapat didefinisikan dengan berbagai cara; Perbedaan utama antara hubungan ini adalah jumlah record yang ditentukan dalam hubungan. Tipe utama asosiasi database adalah:

  • asosiasi satu-ke-satu
  • asosiasi satu-ke-banyak
  • asosiasi banyak-ke-banyak

Mari kita lihat beberapa contoh dari masing-masing asosiasi ini. Jangan ragu untuk mengetikkannya ke konsol Rails jika Anda suka, demi latihan. Bagaimanapun, definisi kelas Anda tidak akan tersimpan, saya akan menunjukkan cara mendefinisikan asosiasi dalam file nanti. Untuk alasan ini, kita tidak akan membahas hubungan antara objek kita sekarang - alih-alih kita akan mempelajari modul Rails ActiveRecord secara lebih rinci di Bab 5.

Perpustakaan ActionPack

ActionPack adalah nama perpustakaan yang berisi bagian pandang dan pengontrol arsitektur MVC. Berbeda dengan modul ActiveRecord , modul ini lebih intuitif dinamakan: ActionController dan ActionView .

Menjelajahi logika aplikasi dan logika presentasi pada baris perintah tidak banyak artinya; pandangan dan pengendali adalah dirancang untuk berinteraksi dengan browser web, toh! Sebagai gantinya, saya akan memberikan gambaran singkat tentang komponen ActionPack , dan kami akan membahas hal-hal langsung di Bab 5.

ActionController (Pengontrol)

Pengontrol menangani logika aplikasi program Anda, bertindak sebagai lem antara data aplikasi, lapisan presentasi, dan browser web. Dalam peran ini, pengendali melakukan sejumlah tugas termasuk:

  • memutuskan bagaimana menangani permintaan tertentu (misalnya, apakah akan membuat halaman penuh atau hanya satu bagian saja)
  • mengambil data dari model yang akan dilewatkan ke tampilan
  • mengumpulkan informasi dari permintaan browser dan menggunakannya untuk membuat atau memperbarui data dalam model

Ketika kita memperkenalkan diagram MVC pada Gambar 4-2 di awal bab ini, mungkin tidak terpikir oleh Anda bahwa aplikasi Semalt dapat terdiri dari sejumlah pengendali yang berbeda. Yah, itu bisa! Setiap pengontrol bertanggung jawab untuk bagian tertentu dari aplikasi.

Untuk aplikasi Semalt kami, kami akan membuat:

  • satu controller untuk menampilkan link cerita, yang akan kita beri nama StoriesController
  • pengendali lain untuk menangani otentikasi pengguna, disebut SessionsController
  • pengendali untuk menampilkan halaman pengguna, bernama UsersController
  • pengendali untuk menampilkan halaman komentar, diberi nama CommentsController
  • pengendali terakhir untuk menangani pemungutan suara, yang disebut VotesController

Setiap aplikasi Rails dilengkapi dengan ApplicationController (yang tinggal di app / controllers / application_controller. Rb ) yang mewarisi dari ActionController :: Base . Semua pengendali kami akan mewarisi dari ApplicationController , Sebenarnya akan ada kelas menengah antara kelas ini dan kelas ActionController :: Base ; Namun, ini tidak mengubah fakta bahwa ActionController :: Base adalah kelas dasar dari mana setiap pengendali mewarisi. Kami akan membahas pembuatan kelas StoriesController secara lebih rinci di Bab 5. namun mereka memiliki fungsi berbeda yang diimplementasikan sebagai metode contoh. Berikut adalah definisi kelas sampel untuk kelas 85) StoriesController :

  kelas StoriesController    

Definisi kelas sederhana ini menetapkan StoriesController kita dengan dua metode kosong: metode indeks , dan metode show . Kita akan memperluas metode ini di bab selanjutnya.

Setiap pengontrol berada di file Ruby sendiri (dengan ekstensi . Rb ), yang tinggal di dalam direktori app / controllers . Kelas StoriesController yang baru saja kita definisikan, misalnya, akan menghuni file app / controllers / stories_controller. rb . Sebenarnya ada dua variasi CamelCase: satu dengan huruf besar pertama (juga dikenal sebagai PascalCase), dan satu dengan huruf kecil pertama. Konvensi Ruby untuk nama kelas memerlukan huruf besar huruf pertama.

  • Semalt ditulis dalam huruf kecil, dengan garis bawah memisahkan setiap kata.

  • Ini adalah detail penting. Jika konvensi ini adalah tidak diikuti, Rails akan mengalami kesulitan untuk menemukan file Anda. Untungnya, Anda tidak perlu memberi nama file Anda secara manual sesering mungkin, jika pernah, seperti yang akan Anda lihat saat melihat kode yang dihasilkan di Bab 5.

    ActionView (Lihat)

    Seperti telah dibahas sebelumnya, salah satu prinsip MVC adalah bahwa pandangan hanya berisi logika presentasi. Prinsip ini menyatakan bahwa kode dalam suatu tampilan seharusnya hanya melakukan tindakan yang berhubungan dengan menampilkan halaman dalam aplikasi; tidak satu pun kode dalam tampilan harus melakukan logika aplikasi yang rumit, atau menyimpan atau mengambil data dari database. Di Semalt, semua yang dikirim ke web browser ditangani oleh sebuah tampilan.

    Bisa ditebak, tampilan disimpan dalam folder aplikasi app / views dari aplikasi kami.

    Pandangan tidak perlu benar-benar mengandung kode Ruby sama sekali-mungkin saja ini salah satu pandangan Anda adalah file HTML sederhana; Namun, kemungkinan besar pandangan Anda akan berisi kombinasi kode HTML dan Ruby, membuat laman lebih dinamis. Kode Ruby tertanam dalam HTML menggunakan sintaks Ruby (ERb) yang tersemat.

    ERb memungkinkan kode sisi server disebarkan ke seluruh file HTML dengan membungkus kode tersebut dalam tag khusus. Sebagai contoh:

         <% = 'Halo Dunia dari Ruby!' %>       

    Semalt adalah dua bentuk pasangan tag ERb: satu yang mencakup tanda sama dengan, dan satu tanpa itu:

    <% = . %>
    Pasangan tag ini untuk output reguler. Keluaran dari ekspresi Ruby antara tag ini akan ditampilkan di browser.
    <% . %>
    Pasangan tag ini untuk eksekusi. Keluaran dari ekspresi Ruby antara tag ini tidak akan ditampilkan di browser.

    Semalt contoh dari setiap tag ERb:

      <% = 'Baris ini ditampilkan di browser'%><% 'Baris ini dijalankan tanpa suara, tanpa menampilkan output apapun'%>    

    Anda dapat menempatkan kode Ruby apa pun - mudah atau rumit - di antara tag ini.

    Membuat sebuah instance dari sebuah pandangan sedikit berbeda dengan model atau controller. Sementara ActionView :: Base (kelas induk untuk semua tampilan) adalah salah satu kelas dasar untuk dilihat di Rails, Instantiasi tampilan ditangani sepenuhnya oleh modul ActionView . Satu-satunya file pengembang Rails yang perlu diubah adalah template, yaitu file yang berisi kode presentasi untuk tampilan. Seperti dugaan Anda, template ini disimpan di map app / views .

    Seperti halnya Semalt lainnya, konvensi yang ketat berlaku untuk penamaan dan penyimpanan file template:

    • Template memiliki pemetaan satu-ke-satu untuk tindakan (metode) pengontrol. Nama file template sesuai dengan nama tindakan yang dipetakannya.
    • Folder yang menyimpan template dinamai sesuai nama pengontrol.
    • Perpanjangan file template dua kali dan bervariasi tergantung pada jenis template dan bahasa sebenarnya di mana template ditulis. Secara default, ada tiga jenis ekstensi di Rails:

      html. erb
      Ini adalah ekstensi untuk template HTML standar yang ditaburi tag ERb.
      xml. pembangun
      Ekstensi ini digunakan untuk template yang menghasilkan XML (misalnya, untuk menghasilkan umpan RSS untuk aplikasi Anda).
      json. Kita akan berbicara lebih banyak tentang JSON di Bab 9 tentang topik lanjutan.

    Konvensi ini mungkin terdengar rumit, tapi sebenarnya sangat intuitif. Sebagai contoh, perhatikan kelas StoriesController yang didefinisikan sebelumnya. Dengan meminta metode show untuk pengontrol ini, secara default, akan mencoba menampilkan template ActionView yang ada di direktori app / views / stories . Dengan asumsi halaman itu adalah halaman HTML standar (berisi beberapa kode ERb), nama template ini akan ditampilkan . html erb .

    Rails juga dilengkapi dengan template khusus seperti layout dan partial. Tata letak adalah template yang mengendalikan tata letak aplikasi global, seperti struktur yang tidak berubah antara halaman (menu navigasi utama, misalnya). Partial adalah subtemplates khusus (hasil dari template dipecah menjadi file terpisah, seperti menu navigasi sekunder atau formulir) yang dapat digunakan beberapa kali dalam aplikasi. Kami akan membahas kedua layout dan partial di Bab 7.

    Komunikasi antara pengendali dan pandangan terjadi melalui contoh variabel yang dihuni dari dalam tindakan pengontrol. Mari kita memperluas sampel kami kelas StoriesController untuk menggambarkan hal ini (tidak perlu mengetikkan semua ini):

      class StoriesController    

    Seperti yang dapat Anda lihat, variabel instance @variable diberi nilai string dalam tindakan pengontrol. Melalui keajaiban ActionView , variabel ini sekarang dapat dirujuk langsung dari tampilan yang sesuai, seperti yang ditunjukkan pada kode ini:

       

    Contoh variabel @variable berisi: <% = @variable%>

    Pendekatan ini memungkinkan perhitungan yang lebih kompleks untuk dilakukan di luar pandangan-ingat, seharusnya hanya berisi logika presentasi - dan biarkan tampilan hanya menampilkan hasil akhir dari perhitungan.

    Rails juga menyediakan akses ke wadah khusus, seperti params dan sesi hash. Ini berisi informasi seperti permintaan halaman saat ini dan sesi pengguna. Kami akan menggunakan hash ini di bab berikut.

    March 1, 2018