Fitur Rails 6: Apa yang Baru dan Mengapa Penting
Diterbitkan: 2022-03-11Seperti yang mungkin diketahui oleh sebagian besar penggemar Ruby on Rails, Rails 6 akan segera hadir, dan membawa sejumlah fitur dan perubahan yang ditunggu-tunggu. Tujuan artikel ini adalah untuk membiasakan Anda dengan fitur-fitur utama yang ditambahkan ke Rails 6 dan menguraikan bagaimana fitur-fitur tersebut dapat membantu membuat aplikasi Anda lebih baik, sehingga menghemat waktu pengembangan yang berharga.
Sebagai permulaan, ingatlah bahwa Rails 6 membutuhkan Ruby 2.5+ dan database yang ditingkatkan. Jadi, pastikan Anda memiliki rencana untuk meningkatkan sistem Anda, jika Anda belum melakukannya.
Jadi apa saja fitur-fitur baru ini? Berikut adalah rekap cepat dari fitur-fitur utama Rails 6 yang kemungkinan besar akan Anda gunakan untuk maju:
Pengujian di Rel 6
Sebagai pengembang Ruby on Rails profesional, kami bertujuan untuk memastikan cakupan maksimum untuk kode kami. Namun, pengujian menjadi aktivitas yang membosankan ketika kasus pengujian kami menjadi "berat" dan kami harus menunggu beberapa menit, atau bahkan berjam-jam, hanya untuk menyelesaikan kasus pengujian.
Pengujian Paralel
Nah, Rails 6 punya jawabannya di sini. Itu telah menambahkan metode parallelize
ke ActiveSupport::TestCase
yang memungkinkan Anda untuk memparalelkan rangkaian pengujian dengan proses bercabang.
Jadi, yang perlu Anda lakukan untuk memparalelkan proses pengujian Anda adalah menambahkan ini ke test_helper.rb
Anda :
parallelize(workers: 2)
Atau, kita dapat mengganti perintah yang sebelumnya digunakan untuk menjalankan tes. Misalnya, bin/rails test OR bin/rspec spec
sekarang dapat diganti dengan PARALLEL_WORKERS=15 rails test OR PARALLEL_WORKERS=15 rspec spec
.
Dengan demikian, Anda dapat mengubah perintah untuk menjalankan rangkaian pengujian pada platform CI yang berbeda seperti Travis, Gitlab, CircleCI, dan lainnya.
Ada juga kait ketika setiap proses dibuat/dihancurkan, yang dapat digunakan sebagai berikut:
class ActiveSupport::TestCase parallelize_setup do |worker| # setup databases end parallelize_teardown do |worker| # cleanup databases end parallelize(workers: :number_of_processors) end
Catatan: Jika Anda ingin mempelajari lebih lanjut, Anda dapat melihat Rails Guides untuk detail tambahan.
Pengujian Kabel Aksi
Karena kita berbicara tentang pengujian yang efisien, mari kita juga memahami bagaimana Action Cable, salah satu fitur paling menonjol dari Rails 5, telah meningkat. Sekarang dimungkinkan untuk menguji Kabel Aksi di tingkat mana pun: koneksi , saluran , dan siaran .
Tes koneksi bertujuan untuk memeriksa apakah pengidentifikasi koneksi ditetapkan dengan benar atau permintaan koneksi yang tidak tepat ditolak:
class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase test "connects with params" do connect params: { user_id: 42 } OR cookies.signed[:user_id] = "42" connect assert_equal connection.user_id, "42" end test "rejects connection without params" do assert_reject_connection { connect } end end
Tes saluran dapat ditulis untuk memeriksa apakah pengguna dapat berlangganan saluran dan saluran tersebut memiliki aliran:
class ChatChannelTest < ActionCable::Channel::TestCase test "subscribes and stream for room" do # Simulate a subscription creation by calling `subscribe` subscribe room: "15" # You can access the Channel object via `subscription` in tests assert subscription.confirmed? assert_has_stream "chat_15" end end
Penyiaran ke saluran dapat diuji seperti ini:
# app/jobs/chat_relay_job.rb class ChatRelayJob < ApplicationJob def perform_later(room, message) ChatChannel.broadcast_to room, text: message end end # test/jobs/chat_relay_job_test.rb require 'test_helper' class ChatRelayJobTest < ActiveJob::TestCase include ActionCable::TestHelper test "broadcast message to room" do room = rooms(:all) assert_broadcast_on(ChatChannel.broadcasting_for(room), text: "Hi!") do ChatRelayJob.perform_now(room, "Hi!") end end end
Catatan: Lebih banyak tips tentang cara menguji dapat ditemukan di sini.
Sisipkan dan Sisipan Massal
Pada titik tertentu, kita semua perlu memasukkan banyak catatan sekaligus dan telah menemukan banyak solusi saat melakukannya. Nah, Rails 6 hadir dengan metode baru di luar kotak— insert_all
, mirip dengan update_all
.
Itu tidak akan mengaktifkan panggilan balik apa pun dan akan menjalankan satu kueri SQL. Ada metode tambahan upsert_all
yang memungkinkan Anda untuk menggunakan operasi upsert yang diekspos oleh banyak database modern seperti Postgres. Jadi sekarang Anda dapat mengurangi kueri penyisipan dan membuat kode Anda lebih optimal. Juga, ucapkan selamat tinggal pada permata yang digunakan sebelumnya seperti activerecord-import
.
Satu kueri INSERT
SQL disiapkan oleh metode ini, dan satu pernyataan SQL dikirim ke database, tanpa membuat instance model, atau memanggil callback dan validasi Rekaman Aktif. Dimungkinkan juga untuk menentukan kriteria ketika kunci utama—indeks unik atau batasan unik dilanggar dengan opsi untuk melewati atau menjalankan kueri atas.
Beberapa contoh di bawah ini:
result = Article.insert_all( [ { id: 1, title: 'Handling 1M Requests Per Second', author: 'John', slug: '1m-req-per-second' }, #...snip... ], returning: %w[ id title ], unique_by: :index_articles_on_title_and_author ) result = Article.upsert_all( [ { id: 1, title: 'Handling 1M Requests Per Second', author: 'John', slug: '1m-req-per-second' }, { id: 1, .... }, # duplicate 'id' here { id: 2, .... }, { id: 3, .... }, # duplicate 'title' and 'author' here { id: 4, .... }, { id: 5, .... }, # duplicate 'slug' here { id: 6, .... } ] )
Metode insert
, insert!
dan upsert
adalah pembungkus di sekitar insert_all
, insert_all!
dan upsert_all
, masing-masing.
Catatan: Ada artikel yang sangat bagus yang membahas kueri massal sehubungan dengan basis data yang berbeda. Jika Anda memerlukan informasi tambahan, pastikan Anda memeriksanya.
Beralih Antara Beberapa Basis Data
Salah satu fitur utama yang akan dihargai oleh banyak aplikasi besar adalah yang satu ini: Rails 6 akhirnya menambahkan dukungan untuk banyak basis data untuk aplikasi Anda, sudah terpasang dan siap digunakan, di luar kotak!
Tentu saja, pilihan desain tetap menjadi milik Anda, apakah Anda ingin memecah aplikasi Anda menjadi beberapa layanan mikro dengan masing-masing memiliki database terpisah, atau mengambil rute monolitik, atau menambahkan beberapa replika baca untuk aplikasi Anda.
Namun, memiliki kemampuan untuk melakukannya dengan cara yang begitu mudah berpotensi menghemat banyak waktu di bagian depan pengembangan.
Jadi, beginilah tampilan file database.yml
baru Anda:
development: primary: database: my_primary_db user: root primary_replica: database: my_primary_db user: ro_user replica: true animals: database: my_animals_db user: root animals_replica database: my_animals_db user: ro_user replica: true
Berikut adalah cara menarik untuk menentukan cara beralih ke database yang berbeda:
class AnimalsModel < ApplicationRecord self.abstract_class = true connects_to database: { writing: :animals_primary, reading: :animals_replica } end class Dog < AnimalsModel # connected to both the animals_primary db for writing and the animals_replica for reading end
Ini adalah halaman GitHub resmi, yang juga didokumentasikan dengan baik. Secara pribadi, saya berharap untuk memiliki kemampuan sharding basis data di pembaruan Rails di masa mendatang juga (seperti ini).
Kotak Surat Tindakan
Fitur Rails 6 menarik lainnya adalah penambahan Action Mailbox, yang menambahkan kemampuan untuk mengarahkan email masuk ke controller seperti kotak surat untuk diproses di Rails.
Action Mailbox menampilkan ingress untuk Mailgun, Mandrill, Postmark, dan SendGrid. Anda juga dapat menangani email masuk secara langsung melalui ingress bawaan Exim, Postfix, dan Qmail. Sekarang, Anda mungkin bisa membayangkan keuntungan potensial tanpa membahas lebih detail. Mungkin secara langsung memproses email dari meja bantuan hingga mengotomatiskan tiket dukungan—Rails 6 memungkinkan pelanggan untuk membalas langsung melalui email, dan masih banyak lagi. Lantai terbuka bagi Anda untuk menjelajahi fitur ini dan menghasilkan pendekatan yang ideal untuk aplikasi Anda.

Berikut adalah contoh kecil untuk memahami cara menggunakan Action Mailbox:
COMMENTS_REGEX = /^comment\+(.+)@example\.com/i # app/mailboxes/application_mailbox.rb class ApplicationMailbox < ActionMailbox::Base routing COMMENTS_REGEX => :comments end # app/mailboxes/comments_mailbox.rb class CommentsMailbox < ApplicationMailbox def process user = User.find_by(email: mail.from) post_uuid = COMMENTS_REGEX.match(mail.to)[1] post = Post.find_by(uuid: post_uuid) post.comments.create(user: user, content: mail.body) end end
Juga, cara baru untuk mengonfigurasi email adalah sebagai berikut (mengambil contoh Sendgrid):
# config/environments/production.rb config.action_mailbox.ingress = :sendgrid
Gunakan rails credentials:edit
untuk menambahkan kata sandi ke kredensial terenkripsi aplikasi Anda di bawah action_mailbox.ingress_password
, di mana Action Mailbox akan menemukannya secara otomatis:
action_mailbox: ingress_password: …
Konfigurasikan SendGrid Inbound Parse untuk meneruskan email masuk ke /rails/action_mailbox/sendgrid/inbound_emails
dengan nama pengguna actionmailbox
dan kata sandi yang Anda buat sebelumnya. Jika aplikasi Anda berada di https://example.com
, Anda akan mengonfigurasi SendGrid dengan URL berikut:
https://actionmailbox:[email protected]/rails/action_mailbox/sendgrid/i
Jika Anda ingin menjelajahinya lebih jauh, Rails sudah memiliki panduannya di sini.
Zeitwerk
Zeitwerk adalah pemuat kode baru untuk Ruby. Dengan struktur file konvensional, Zeitwerk memuat kelas dan modul proyek Anda sesuai permintaan, artinya Anda tidak perlu menulis panggilan yang diperlukan untuk file Anda sendiri. Untuk mengaktifkannya di Rails 6, Anda dapat melakukan hal berikut:
config.autoloader = :zeitwerk
Anda dapat membaca lebih lanjut tentang Zeitwerk di sini.
Petunjuk Pengoptimal
Anda khawatir bahwa beberapa kueri Anda membutuhkan waktu terlalu lama untuk dieksekusi? Nah, sekarang Anda memiliki cara untuk menentukan batas waktu untuk kueri Anda juga.
Pernyataan berikut akan memunculkan pengecualian StatementTimeout
jika kueri membutuhkan waktu lebih lama dari biasanya untuk dieksekusi:
User.optimizer_hints("MAX_EXECUTION_TIME(5000)").all
Ini didukung oleh MySQL dan Anda harus mencari tahu apakah database Anda mendukungnya.
Pangkas Basis Data
Bagaimana dengan data penyemaian? Pernyataan berikut akan memotong semua tabel database Anda dan Anda kemudian dapat melanjutkan untuk menyemai data Anda:
rails db:truncate_all
Tidak perlu lagi menghapus database Anda untuk seed. Anda mungkin akan setuju bahwa ini adalah solusi yang elegan dan cepat.
Teks Tindakan
Mungkin fitur penting lainnya untuk banyak aplikasi yang bermain dengan editor WYSIWYG adalah penambahan dukungan untuk editor Trix secara native ke dalam aplikasi Rails 6. Ini tentu akan menjadi peningkatan/penambahan yang baik untuk banyak proyek.
Sebagian besar editor HTML WYSIWYG memiliki cakupan yang sangat luas—setiap implementasi browser memiliki kumpulan bug dan kebiasaannya sendiri, dan pengembang JavaScript dibiarkan menyelesaikan inkonsistensi. Trix menghindari inkonsistensi ini dengan memperlakukan konten yang dapat contenteditable
sebagai perangkat I/O: Saat input masuk ke editor, Trix mengonversi input tersebut menjadi operasi pengeditan pada model dokumen internalnya, lalu merender ulang dokumen itu kembali ke editor. Ini memberi Trix kendali penuh atas apa yang terjadi setelah setiap penekanan tombol.
Instalasi:
rails action_text:install # app/models/message.rb class Message < ApplicationRecord has_rich_text :content end
Anda dapat menjelajahi Teks Tindakan lebih detail dalam dokumentasi resmi, di sini.
Keamanan
Tidak ada peningkatan serius yang lengkap tanpa beberapa peningkatan keamanan. Rails 6 juga tidak mengecewakan di bagian keamanan. Peningkatan keamanan penting pertama adalah penambahan dukungan untuk Otorisasi Host .
Otorisasi Host adalah middleware baru yang menjaga dari serangan DNS rebinding dengan secara eksplisit mengizinkan host untuk mengirim permintaan. Artinya, Anda dapat menentukan host yang dapat mengakses aplikasi Anda.
Peningkatan keamanan lainnya dimaksudkan untuk menggagalkan serangan yang mencoba menyalin nilai cookie yang ditandatangani/dienkripsi dan menggunakannya sebagai nilai cookie lain. Ia melakukannya dengan menyimpan nama cookie di bidang tujuan yang kemudian ditandatangani/dienkripsi bersama dengan nilai cookie. Kemudian, pada pembacaan sisi server, kami memverifikasi nama cookie dan membuang cookie yang diserang. Aktifkan action_dispatch.use_cookies_with_metadata
untuk menggunakan fitur ini, yang menulis cookie dengan tujuan baru dan metadata kedaluwarsa yang disematkan.
Webpack sebagai Bundler Default
Seperti standar de facto dengan banyak kerangka kerja JavaScript modern untuk pengembangan front-end, Rails 6 telah menambahkan Webpack sebagai bundler JavaScript default melalui permata webpacker, menggantikan pipeline Rails Asset. Ini adalah tambahan yang relatif mudah, dan kami tidak akan membahas banyak detail. Cukuplah untuk mengatakan bahwa Webpack akan memberikan sedikit kelegaan bagi pengembang front-end yang terlalu banyak bekerja.
Mencegah Kondisi Balapan
Rails 6 memiliki metode baru yang digunakan untuk mencegah kondisi balapan SELECT/INSERT dalam kode kami (saya yakin banyak pembaca yang mengalami kemalangan menghadapi kondisi balapan saat mereka menskalakan proyek mereka). Ini adalah utas GitHub jika Anda memerlukan info tambahan.
Tabel yang mendasari harus memiliki kolom relevan yang ditentukan dengan batasan unik. Meskipun kami menghindari kondisi balapan antara SELECT → INSERT dari #find_or_create_by
, kami sebenarnya memiliki kondisi balapan lain antara INSERT → SELECT, yang dapat dipicu jika DELETE antara dua pernyataan dijalankan oleh klien lain. Namun, untuk sebagian besar aplikasi, itu adalah kondisi yang secara signifikan lebih kecil kemungkinannya untuk kami alami.
Kredensial di Rails 6
Sejak zaman Rails 5.2, kredensial telah dinamai "cara Rails" baru untuk menangani informasi sensitif dengan janji untuk menyingkirkan file .env yang terkenal sekali dan untuk selamanya. Dengan kredensial, kunci terenkripsi untuk layanan pihak ketiga dapat diperiksa langsung ke kontrol sumber.
Namun, hingga saat ini, Rails menggunakan file terenkripsi yang sama untuk semua lingkungan, yang membuat penanganan dengan kunci yang berbeda dalam pengembangan dan produksi menjadi sedikit rumit, terutama saat menangani proyek besar dan kode lama.
Di Rails 6, ini akhirnya diselesaikan dengan dukungan untuk kredensial per-lingkungan. Sekali lagi, detail lebih lanjut dapat dieksplorasi di utas resmi GitHub.
Apakah Rails 6 merupakan Pembaruan yang Baik?
Ya, dan sebenarnya Rails 6 dapat digambarkan sebagai pembaruan besar, meskipun hanya sedikit yang menyebutnya sebagai pengubah permainan. Karena Ruby on Rails telah ada selama bertahun-tahun, hanya sedikit orang yang mengharapkan perubahan revolusioner, tetapi inkarnasi keenamnya membawa banyak hal.
Beberapa fitur yang diluncurkan di Rails 6 tampak seperti perbaikan kecil, sementara yang lain berpotensi menghemat banyak waktu pengembangan, meningkatkan keamanan, ketahanan, dan sebagainya. Intinya: Rails sudah matang, banyak pengembang tetap antusias dengan masa depannya, dan dengan dirilisnya Rails 6, ini menjadi lebih baik.
Tentu saja, daftar fitur Rails 6 ini tidak lengkap dan untuk melihat set lengkap perubahan, Anda perlu memeriksa changelog. Selain itu, ada banyak penolakan yang harus Anda pertimbangkan. Terakhir, jika Anda bersikeras untuk memeriksa setiap perubahan dan memperbarui diri Anda sendiri, harap baca catatan rilis lengkapnya.