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ı!

Veritabanları arasında geçiş şeması

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.