Rails 6 Özellikleri: Yenilikler ve Neden Önemli?
Yayınlanan: 2022-03-11Çoğu Ruby on Rails hayranının bildiği gibi, Rails 6 yakında geliyor ve heyecanla beklenen bir dizi özellik ve değişiklik getiriyor. Bu makalenin amacı, sizi Rails 6'ya eklenen temel özelliklerle tanıştırmak ve uygulamalarınızı daha iyi hale getirmeye nasıl yardımcı olabileceklerini özetlemek ve böylece değerli geliştirme zamanından tasarruf etmektir.
Yeni başlayanlar için, Rails 6'nın Ruby 2.5+ ve yükseltilmiş veritabanları gerektirdiğini unutmayın. Bu nedenle, henüz yapmadıysanız, sistemlerinizi buna göre yükseltmek için bir planınız olduğundan emin olun.
Peki nedir bu yeni özellikler? İlerlemek için muhtemelen kullanacağınız önemli Rails 6 özelliklerinin kısa bir özeti:
Rails 6'da Test Etme
Profesyonel Ruby on Rails geliştiricileri olarak, kodumuz için maksimum kapsamı sağlamayı amaçlıyoruz. Bununla birlikte, test senaryolarımız "ağır" hale geldiğinde ve test senaryolarının yürütülmesi için birkaç dakika hatta saatlerce beklememiz gerektiğinde, test etme sıkıcı bir faaliyet haline gelir.
Paralel Test
Eh, Rails 6'nın burada bir cevabı var. ActiveSupport::TestCase
, test takımını çatallı süreçlerle paralelleştirmenize izin veren bir parallelize
yöntemi ekledi.
Bu nedenle, testleriniz için süreçleri paralel hale getirmek için yapmanız gereken, bunu test_helper.rb
dosyanıza eklemektir:
parallelize(workers: 2)
Alternatif olarak, testleri çalıştırmak için daha önce kullanılan komutlarımızı değiştirebiliriz. Örneğin, bin/rails test OR bin/rspec spec
artık PARALLEL_WORKERS=15 rails test OR PARALLEL_WORKERS=15 rspec spec
ile değiştirilebilir.
Buna göre, test takımlarını Travis, Gitlab, CircleCI ve diğerleri gibi farklı CI platformlarında çalıştırma komutlarını değiştirebilirsiniz.
Ayrıca, her işlem oluşturulduğunda/yok edildiğinde aşağıdaki gibi kullanılabilen kancalar da vardır:
class ActiveSupport::TestCase parallelize_setup do |worker| # setup databases end parallelize_teardown do |worker| # cleanup databases end parallelize(workers: :number_of_processors) end
Not: Daha fazlasını öğrenmek isterseniz, ek ayrıntılar için Rails Guides'a göz atabilirsiniz.
Eylem Kablo Testi
Verimli testlerden bahsettiğimize göre, Rails 5'in en göze çarpan özelliklerinden biri olan Action Cable'ın nasıl geliştiğini de anlayalım. Artık Action Cable'ı herhangi bir düzeyde test etmek mümkündür: bağlantılar , kanallar ve yayınlar .
Bağlantı testleri , bir bağlantının tanımlayıcılarının doğru atanıp atanmadığını veya uygun olmayan bağlantı isteklerinin reddedilip reddedilmediğini kontrol etmeyi amaçlar:
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
Kullanıcıların kanallara abone olup olmadığını ve kanalın bir akışı olup olmadığını kontrol etmek için kanal testleri yazılabilir:
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
Kanallara yayın şu şekilde test edilebilir:
# 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
Not: Nasıl test edileceğine dair daha fazla ipucu burada bulunabilir.
Toplu Ekleme ve Üst Baskı
Bir noktada, hepimizin tek seferde birden fazla kayıt eklememiz gerekiyor ve bunu yaparken birçok geçici çözüm bulduk. Peki, Rails 6 kutudan çıktığı gibi yeni bir yöntemle gelir - update_all
benzer insert_all
.
Herhangi bir geri arama başlatmaz ve tek bir SQL sorgusu yürütür. Postgres gibi birçok modern veritabanları tarafından açığa çıkarılan upsert işlemini kullanmanıza izin veren ek bir upsert_all
yöntemi vardır. Artık ekleme sorgularınızı azaltabilir ve kodunuzu daha optimize hale getirebilirsiniz. Ayrıca, activerecord-import
gibi daha önce kullanılan taşlara veda edin.
Bu yöntemlerle tek bir INSERT
SQL sorgusu hazırlanır ve modeli örneklemeden veya Active Record geri aramaları ve doğrulamalarını çağırmadan veritabanına tek bir SQL ifadesi gönderilir. Birincil anahtar, benzersiz dizinler veya benzersiz kısıtlamalar, atlama veya üst sorguları çalıştırma seçeneğiyle ihlal edildiğinde de ölçütler tanımlamak mümkündür.
Bazı örnekler aşağıdadır:
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, .... } ] )
Yöntemler insert
, insert!
ve upsert
, insert_all
, insert_all!
ve sırasıyla upsert_all
.
Not: Farklı veritabanlarına göre toplu sorguları tartışan çok iyi bir makale var. Ek bilgiye ihtiyacınız varsa, kontrol ettiğinizden emin olun.
Birden Çok Veritabanı Arasında Geçiş Yapma
Birçok büyük uygulamanın takdir edeceği ana özelliklerden biri şudur: Rails 6 nihayet uygulamanız için çoklu veritabanları için destek ekledi, yerleşik ve kullanıma hazır, kutudan çıktı!
Uygulamanızı, her biri ayrı bir veritabanına sahip birden çok mikro hizmete bölmek, monolitik bir yol izlemek ya da uygulamanız için birkaç okuma kopyası eklemek istiyorsanız, tasarım seçimi yine de sizindir.
Ancak, bunu bu kadar kolay bir şekilde yapma yeteneğine sahip olmak, geliştirme cephesinde çok zaman kazandırma potansiyeline sahiptir.
Yeni database.yml
dosyanız şu şekilde görünecektir:
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
Farklı veritabanlarına nasıl geçileceğini belirlemenin ilginç yolları şunlardır:
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
İşte güzel bir şekilde belgelenmiş resmi GitHub sayfası. Şahsen, gelecekteki Rails güncellemelerinde de (bunun gibi bir şey) veritabanı parçalama yeteneklerine sahip olmayı dört gözle bekliyorum.
Eylem Posta Kutusu
Rails 6'nın bir başka ilginç özelliği, gelen e-postaları Rails'de işlenmek üzere posta kutuları gibi denetleyiciye yönlendirme yeteneği ekleyen Action Mailbox'ın eklenmesidir.
Action Mailbox, Mailgun, Mandrill, Postmark ve SendGrid için girişlere sahiptir. Ayrıca gelen e-postaları doğrudan yerleşik Exim, Postfix ve Qmail girişleri aracılığıyla da yönetebilirsiniz. Şimdi, muhtemelen daha fazla ayrıntıya girmeden potansiyel faydaları hayal edebilirsiniz. Bir yardım masasından gelen e-postaları doğrudan destek biletlerinin otomatikleştirilmesine kadar işliyor olabilir—Rails 6, müşterilerin doğrudan e-posta yoluyla yanıt vermesini ve çok daha fazlasını sağlar. Bu özelliği keşfetmeniz ve uygulamanız için ideal bir yaklaşım bulmanız için zemin açıktır.

Eylem Posta Kutusunun nasıl kullanılacağını anlamak için küçük bir örnek:
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
Ayrıca, e-postaları yapılandırmanın yeni yolu aşağıdaki gibidir (Sendgrid örneğini alarak):
# config/environments/production.rb config.action_mailbox.ingress = :sendgrid
Parolayı action_mailbox.ingress_password
altında uygulamanızın şifrelenmiş kimlik bilgilerine eklemek için rails credentials:edit
, Action Mailbox bunu otomatik olarak bulur:
action_mailbox: ingress_password: …
SendGrid Gelen Ayrıştırmasını, gelen e-postaları /rails/action_mailbox/sendgrid/inbound_emails
kullanıcı adı actionmailbox
ve daha önce oluşturduğunuz parola ile iletmek için yapılandırın. Uygulamanız https://example.com
yaşıyorsa SendGrid'i aşağıdaki URL ile yapılandırırsınız:
https://actionmailbox:[email protected]/rails/action_mailbox/sendgrid/i
Bunu daha fazla araştırmak isterseniz, Rails'in burada zaten bir kılavuzu var.
Zeitwerk
Zeitwerk, Ruby için yeni kod yükleyicidir. Geleneksel bir dosya yapısı göz önüne alındığında, Zeitwerk projenizin sınıflarını ve modüllerini talep üzerine yükler, bu da kendi dosyalarınız için gerekli çağrıları yazmanıza gerek olmadığı anlamına gelir. Rails 6'da etkinleştirmek için aşağıdakileri yapabilirsiniz:
config.autoloader = :zeitwerk
Zeitwerk hakkında daha fazla bilgiyi buradan okuyabilirsiniz.
Optimize Edici İpuçları
Bazı sorgularınızın yürütülmesinin çok uzun sürmesinden mi endişe ediyorsunuz? Artık sorgularınız için zaman aşımları tanımlamanın da bir yolunuz var.
Sorgunun yürütülmesi normalden uzun sürerse, aşağıdaki ifade bir StatementTimeout
istisnası oluşturur:
User.optimizer_hints("MAX_EXECUTION_TIME(5000)").all
MySQL tarafından desteklenir ve veritabanınızın destekleyip desteklemediğini araştırmanız gerekir.
Veritabanını Kes
Tohumlama verileri ne olacak? Aşağıdaki ifade tüm veritabanı tablolarınızı kısaltır ve ardından verilerinizi tohumlamaya devam edebilirsiniz:
rails db:truncate_all
Artık veritabanlarınızı tohumlamak için silmenize gerek yok. Muhtemelen bunun zarif ve hızlı bir çözüm olduğunu kabul edeceksiniz.
Eylem Metni
WYSIWYG editörleriyle oynayan birçok uygulama için belki de bir başka dikkate değer özellik, Rails 6 uygulamalarına yerel olarak Trix editörü desteğinin eklenmesidir. Bu kesinlikle birçok proje için iyi bir yükseltme/ekleme olacaktır.
Çoğu WYSIWYG HTML düzenleyicisinin kapsamı çok büyüktür; her tarayıcının uygulamasının kendi hataları ve tuhaflıkları vardır ve tutarsızlıkları çözmek için JavaScript geliştiricileri bırakılır. Trix, contenteditable
düzenlenebilir bir G/Ç aygıtı olarak ele alarak bu tutarsızlıkları ortadan kaldırır: Giriş düzenleyiciye ulaştığında, Trix bu girişi dahili belge modelinde bir düzenleme işlemine dönüştürür ve ardından bu belgeyi düzenleyicide yeniden işler. Bu, Trix'e her tuş vuruşundan sonra olanlar üzerinde tam kontrol sağlar.
Kurulum:
rails action_text:install # app/models/message.rb class Message < ApplicationRecord has_rich_text :content end
Eylem Metni'ni buradaki resmi belgelerde daha ayrıntılı olarak inceleyebilirsiniz.
Güvenlik
Birkaç güvenlik geliştirmesi olmadan hiçbir ciddi yükseltme tamamlanmış sayılmaz. Rails 6, güvenlik cephesinde de hayal kırıklığına uğratmaz. İlk dikkate değer güvenlik yükseltmesi, Ana Bilgisayar Yetkilendirmesi desteğinin eklenmesidir.
Ana Bilgisayar Yetkilendirmesi, ana bilgisayarlara bir istek gönderilebilmesine açıkça izin vererek DNS yeniden bağlama saldırılarına karşı koruma sağlayan yeni bir ara katman yazılımıdır. Bunun anlamı, uygulamalarınıza erişebilecek ana bilgisayarları tanımlayabilmenizdir.
Başka bir güvenlik yükseltmesi, bir tanımlama bilgisinin imzalı/şifreli değerini kopyalamaya ve bunu başka bir tanımlama bilgisinin değeri olarak kullanmaya çalışan saldırıları engellemek içindir. Bunu, çerez değeriyle birlikte imzalanan/şifrelenen amaç alanına çerez adını saklayarak yapar. Ardından, sunucu tarafı okumasında, çerez adlarını doğrularız ve saldırıya uğrayan çerezleri atarız. Yeni amaçla çerezler yazan ve gömülü meta verileri sona eren meta verilerle yazan bu özelliği kullanmak için action_dispatch.use_cookies_with_metadata
etkinleştirin.
Varsayılan Paketleyici Olarak Web Paketi
Front-end geliştirme için birçok modern JavaScript çerçevesiyle fiili standart olduğu gibi, Rails 6, Webpack'i webpacker gem aracılığıyla varsayılan JavaScript paketleyicisi olarak ekleyerek Rails Asset ardışık düzeninin yerini almıştır. Bu nispeten basit bir eklemedir ve fazla ayrıntıya girmeyeceğiz. Webpack'in çok çalışan ön uç geliştiricilere biraz rahatlama getireceğini söylemek yeterli.
Yarış Koşullarını Önleme
Rails 6, kodumuzda SELECT/INSERT yarış koşullarını önlemek için kullanılan yeni bir metoda sahiptir (eminim birçok okuyucu projelerini ölçeklendirirken yarış koşullarıyla karşılaşma talihsizliğini yaşamıştır). Ek bilgiye ihtiyaç duymanız durumunda GitHub dizisi burada.
Temel tablo, benzersiz kısıtlamalarla tanımlanmış ilgili sütunlara sahip olmalıdır. SELECT → INSERT from #find_or_create_by
arasındaki yarış koşulundan kaçınırken, aslında INSERT → SELECT arasında, bu iki ifade arasında bir DELETE başka bir istemci tarafından çalıştırılırsa tetiklenebilecek başka bir yarış koşulumuz var. Ancak, çoğu uygulama için bu, isabet etme olasılığımız önemli ölçüde daha düşük olan bir durumdur.
Rails 6'daki Kimlik Bilgileri
Rails 5.2 günlerinden bu yana, kimlik bilgileri, kötü şöhretli .env dosyalarından bir kez ve herkes için kurtulma vaadi ile hassas bilgilerle başa çıkmak için yeni bir "Rails yolu" olarak adlandırıldı. Kimlik bilgileriyle, üçüncü taraf hizmetler için şifrelenmiş anahtarlar doğrudan kaynak denetimine kontrol edilebilir.
Ancak şimdiye kadar Rails tüm ortamlar için aynı şifreli dosyayı kullanıyordu, bu da özellikle büyük projeler ve eski kodlarla uğraşırken geliştirme ve üretimde farklı anahtarlarla uğraşmayı biraz zorlaştırıyordu.
Rails 6'da bu, nihayet ortam başına kimlik bilgileri desteğiyle çözüldü. Yine, resmi GitHub dizisinde daha fazla ayrıntı araştırılabilir.
Rails 6 İyi Bir Güncelleme mi?
Evet ve aslında Rails 6 büyük bir güncelleme olarak tanımlanabilir, ancak çok az kişi buna oyun değiştirici diyebilir. Ruby on Rails yıllardır piyasada olduğundan, çok az insan devrim niteliğinde değişiklikler bekliyor, ancak altıncı enkarnasyonu masaya çok şey getiriyor.
Rails 6'da sunulan bazı özellikler küçük iyileştirmeler gibi görünürken, diğerlerinin geliştirme süresinden çok tasarruf etme, güvenliği, sağlamlığı iyileştirme vb. potansiyeli vardır. Alt satır: Rails olgunlaştı, birçok geliştirici geleceği konusunda hevesli olmaya devam ediyor ve Rails 6'nın piyasaya sürülmesiyle daha da iyi oldu.
Tabii ki, bu Rails 6 özellikleri listesi eksik ve tüm değişiklikleri görüntülemek için değişiklik günlüğünü kontrol etmeniz gerekiyor. Ek olarak, göz önünde bulundurmanız gereken birçok kullanımdan kaldırma vardır. Son olarak, her değişikliği tek tek gözden geçirmekte ve kendinizi güncellemekte ısrar ediyorsanız, lütfen tam sürüm notlarını okuyun.