Както повечето фенове на Ruby on Rails може би са наясно, Rails 6 идва скоро и предлага редица очаквани с нетърпение функции и промени. Целта на тази статия е да ви запознае с основните функции, които са добавени към Rails 6, и да очертае как те могат да помогнат за подобряване на вашите приложения, като по този начин спестят ценно време за разработка.
Като начало, не забравяйте, че Rails 6 изисква Ruby 2.5+ и надградени бази данни. Така че, уверете се, че имате план за надграждане на вашите системи по съответния начин, в случай че вече не сте го направили.
И така, какви са тези нови функции? Ето кратко обобщение на основните функции на Rails 6, които вероятно ще използвате, за да продължите напред:
Като професионален Разработчиците на Ruby on Rails , ние се стремим да осигурим максимално покритие за нашия код. Тестването обаче се превръща в досадна дейност, когато нашите тестови случаи станат „тежки“ и трябва да изчакаме няколко минути или дори часове, само за да изпълним тестовите случаи.
Е, Rails 6 има отговор тук. Той е добавил parallelize
метод към ActiveSupport::TestCase
което ви позволява да паралелизирате тестовия пакет с раздвоени процеси.
И така, това, което трябва да направите, за да паралелизирате процесите за вашите тестове, е да добавите това към вашия test_helper.rb
:
parallelize(workers: 2)
Като алтернатива можем да заменим използваните преди команди за провеждане на тестове. Например, bin/rails test OR bin/rspec spec
вече може да бъде заменен с PARALLEL_WORKERS=15 rails test OR PARALLEL_WORKERS=15 rspec spec
.
Съответно можете да промените командите за стартиране на тестовите пакети на различни CI платформи като Travis, Gitlab, CircleCI и други.
Въпроси за интервю за изтичане на java памет
Има и куки, когато всеки процес е създаден / унищожен, който може да се използва, както следва:
class ActiveSupport::TestCase parallelize_setup do |worker| # setup databases end parallelize_teardown do |worker| # cleanup databases end parallelize(workers: :number_of_processors) end
Забележка: Ако искате да научите повече, можете да разгледате Ръководства за релси за допълнителни подробности.
Тъй като говорихме за ефективно тестване, нека разберем и как се е подобрил Action Cable, една от най-забележителните характеристики на Rails 5. Сега е възможно да тествате Action Cable на всяко ниво: връзки , канали , и излъчвания .
Тестове за връзка има за цел да провери дали идентификаторите на връзката се присвояват правилно или нежеланите искания за връзка са отхвърлени:
class ApplicationCable::ConnectionTest Тестове на канали може да се напише, за да се провери дали потребителите могат да се абонират за канали и каналът има поток:
class ChatChannelTest Излъчване към канали може да се тества по следния начин:
# app/jobs/chat_relay_job.rb class ChatRelayJob Забележка: Повече съвети за това как да тествате можете да намерите тук .
Групово вмъкване и добавяне
В един момент всички ние трябва да вмъкнем множество записи едновременно и сме намерили много заобиколни решения, когато правим това. Е, Rails 6 се предлага с нов метод извън кутията - insert_all
, подобен на update_all
.
Той няма да задейства обратни извиквания и ще изпълни една SQL заявка. Има допълнителен метод upsert_all
което ви позволява да използвате операция нагоре което е изложено от много съвременни бази данни като Postgres. Така че сега можете да намалите вашите заявки за вмъкване и да направите своя код по-оптимизиран. Също така, сбогувайте се с използваните преди това скъпоценни камъни като activerecord-import
.
Единичен INSERT
SQL заявката се изготвя чрез тези методи и един SQL израз се изпраща до базата данни, без да се създава екземпляр на модела или да се извикват обратно извикване и валидиране на Active Record. Възможно е също така да се дефинират критерии, когато първичен ключ - уникални индекси или уникални ограничения са нарушени с опция за пропускане или стартиране на запитвания нагоре.
Някои примери са по-долу:
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, .... } ] )
Методите insert
, insert!
и upsert
са обвивки около insert_all
, insert_all!
и upsert_all
, съответно.
Забележка: Има много добра статия, която обсъжда групови заявки по отношение на различна база данни. Ако имате нужда от допълнителна информация, уверете се, че сте виж това .
Превключване между множество бази данни
Една от основните характеристики, които много големи приложения ще оценят, е тази: Rails 6 най-накрая добави поддръжка за множество бази данни за вашето приложение, вградени и готови за работа, веднага!

Разбира се, изборът за дизайн все още е ваш, независимо дали искате да разбиете приложението си на множество микроуслуги, като всеки има отделна база данни, или да поемете монолитен маршрут, или да добавите няколко реплики за четене за вашето приложение.
как да получите своя първи консултантски клиент
Наличието на способността да го направите по толкова лесен начин има потенциал да спести много на времето на фронта за развитие.
И така, това е как вашият нов database.yml
файлът ще изглежда:
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
Ето интересни начини за определяне на начина на преминаване към различни бази данни:
class AnimalsModel Тук е официална страница на GitHub , което също е добре документирано. Лично аз се радвам да имам възможности за рязане на бази данни и при бъдещи актуализации на Rails (нещо като това ).
Пощенска кутия за действие
Друга интересна функция на Rails 6 е добавянето на Пощенска кутия за действие , което добавя способността към маршрутизиране на входящите имейли към контролера като пощенски кутии за обработка в Rails.
Пощенската кутия за действие разполага с адреси за Mailgun, Mandrill, Postmark и SendGrid. Можете също така да обработвате входящи имейли директно чрез вградените адреси Exim, Postfix и Qmail. Вероятно можете да си представите потенциалните ползи, без да навлизате в повече подробности. Възможно е директно обработване на имейли от бюро за помощ до автоматизиране на билети за поддръжка - Rails 6 позволява на клиентите да отговарят директно по имейл и много, много повече. Подът е отворен за вас, за да проучите тази функция и да измислите подход, който е идеален за вашето приложение.
Ето малък пример, за да разберете как да използвате Action Mailbox:
COMMENTS_REGEX = /^comment+(.+)@example.com/i # app/mailboxes/application_mailbox.rb class ApplicationMailbox :comments end # app/mailboxes/comments_mailbox.rb class CommentsMailbox Също така, новият начин за конфигуриране на имейли е както следва (като примера на Sendgrid):
# config/environments/production.rb config.action_mailbox.ingress = :sendgrid
Използвайте rails credentials:edit
за да добавите паролата към криптираните идентификационни данни на приложението си под action_mailbox.ingress_password
, където Action Mail ще я намери автоматично:
action_mailbox: ingress_password: …
Конфигурирайте SendGrid Входящ разбор за препращане на входящи имейли до /rails/action_mailbox/sendgrid/inbound_emails
с потребителското име actionmailbox
и паролата, която сте генерирали преди това. Ако вашето приложение живее на https://example.com
, ще конфигурирате SendGrid със следния URL:
https://actionmailbox: [email protected] /rails/action_mailbox/sendgrid/i
В случай, че искате да проучите това по-нататък, Rails вече има ръководство за това тук .
Цайтверк
Zeitwerk е новият код за зареждане на Ruby. Като се има предвид конвенционална файлова структура, Zeitwerk зарежда класовете и модулите на вашия проект при поискване, което означава, че не е необходимо да пишете изискващи повиквания за вашите собствени файлове. За да го активирате в Rails 6, можете да направите следното:
config.autoloader = :zeitwerk
Можете да прочетете повече за Zeitwerk тук .
Съвети за оптимизатора
Притеснявате се, че някои от вашите заявки отнемат твърде много време за изпълнение? Е, сега имате начин да определите и таймаути за вашите заявки.
Следното изявление ще изведе StatementTimeout
изключение, ако заявката отнема повече време от нормалното за изпълнение:
User.optimizer_hints('MAX_EXECUTION_TIME(5000)').all
Той се поддържа от MySQL и ще трябва да проучите дали вашата база данни го поддържа.
Съкратете базата данни
Какво ще кажете за засяване на данни? Следното изявление ще отсече всичките ви таблици на базата данни и след това можете да продължите към засяването на вашите данни:
rails db:truncate_all
Няма повече изтриване на вашите бази данни в семена. Вероятно ще се съгласите, че това е елегантно и бързо решение.
Текст за действие
Може би друга забележителна функция за много приложения, които играят с WYSIWYG редактори, е добавянето на поддръжка за Редактор на Trix първоначално в Rails 6 приложения. Това със сигурност ще бъде добро надграждане / допълнение за много проекти.
Повечето WYSIWYG HTML редактори са огромни по обхват - изпълнението на всеки браузър има свой собствен набор от грешки и странности, а разработчиците на JavaScript са оставени да разрешат несъответствията. Trix заобикаля тези несъответствия, като третира contenteditable
като входно / изходно устройство: Когато входът си проправи път към редактора, Trix преобразува този вход в операция за редактиране на своя вътрешен модел на документ, след което рендира този документ обратно в редактора. Това дава на Trix пълен контрол върху това, което се случва след всяко натискане на клавиш.
Инсталация:
rails action_text:install # app/models/message.rb class Message Можете да изследвате Текст за действие по-подробно в официалната документация, тук .
Сигурност
Никоя сериозна надстройка не е завършена без няколко подобрения в сигурността. Rails 6 не разочарова и по отношение на сигурността. Първото забележително надграждане на защитата е добавянето на поддръжка за Упълномощаване на хост .
Host Authorization е нов междинен софтуер, който предпазва DNS повторно свързване атаки чрез изрично разрешаване на хостовете може да бъде изпратена заявка. Това означава, че можете да дефинирате хостовете, които имат достъп до вашите приложения.
Друго надграждане на защитата има за цел да осуети атаките, които се опитват да копират подписаната / криптирана стойност на бисквитка и да я използват като стойността на друга бисквитка. Това се прави чрез скриване на името на бисквитката в полето за цел, което след това се подписва / криптира заедно със стойността на бисквитката. След това при четене от страна на сървъра проверяваме имената на бисквитките и изхвърляме всички атакувани бисквитки. Активиране action_dispatch.use_cookies_with_metadata
да използва тази функция, която пише бисквитки с вградената нова цел и срока на годност метаданни.
Webpack като пакет по подразбиране
Както е де факто стандартът с много съвременни JavaScript рамки за разработка отпред, Rails 6 добави Webpack като подразбиращ се JavaScript пакет чрез уеб скъпоценния камък на webpacker, замествайки тръбопровода Rails Asset. Това е относително просто допълнение и няма да навлизаме в много подробности. Достатъчно е да се каже, че Webpack ще донесе известно облекчение на претоварените разработчици от предния край.
Предотвратяване на състезателни условия
Rails 6 има нов метод, който се използва за предотвратяване на състезателни условия SELECT / INSERT в нашия код (сигурен съм, че много читатели са имали нещастието да срещнат състезателни условия, докато мащабират проекта си). Тук е Конец на GitHub в случай, че имате нужда от допълнителна информация.
Базовата таблица трябва да има съответните колони, дефинирани с уникални ограничения. Въпреки че избягваме условието за състезание между SELECT → INSERT от #find_or_create_by
, всъщност имаме друго условие за състезание между INSERT → SELECT, което може да се задейства, ако DELETE между тези два оператора се изпълнява от друг клиент. Но за повечето приложения това е условие, което е значително по-малко вероятно да постигнем.
Идентификационни данни в Rails 6
От дните на Rails 5.2, идентификационните данни са наречени нов „начин на Rails“ за справяне с чувствителна информация с обещание да се отървете от скандалните .env файлове веднъж завинаги. С идентификационни данни, криптирани ключове за услуги на трети страни могат да бъдат проверени директно в контрола на източника.
Досега обаче Rails използваха един и същ шифрован файл за всички среди, което правеше работата с различни ключове в разработването и производството малко сложна, особено когато се занимаваше с големи проекти и наследствен код.
В Rails 6 това най-накрая е решено с поддръжка на идентификационни данни за всяка среда. Отново, допълнителни подробности могат да бъдат проучени на официалния Конец на GitHub .
Rails 6 е добра актуализация?
Да, и всъщност Rails 6 може да бъде описан като основна актуализация, макар че малцина биха го нарекли промяна на играта. Тъй като Ruby on Rails съществува от години, малко хора очакват революционни промени, но шестото му въплъщение донася много на масата.
Някои функции, внедрени в Rails 6, изглеждат като незначителни подобрения, докато други имат потенциал да спестят много време за разработка, да подобрят сигурността, стабилността и т.н. Долен ред: Rails е зрял, много разработчици остават ентусиазирани за бъдещето му , а с пускането на Rails 6, то просто стана още по-добро.
Разбира се, този списък с функции на Rails 6 е непълен и за да видите пълния набор от промени, трябва да проверите дневника на промените. Освен това има много откази, които трябва да имате предвид. И накрая, ако настоявате да преминете през всяка една промяна и да се актуализирате, моля, прочетете бележки за пълното издание .
Разбиране на основите
Ruby on Rails актуален ли е и през 2019 г.?
Rails е по-подходящо от всяко друго решение на пазара. Rails и Ruby се надстройват (Matz прави Ruby 3X по-бърз). Rails 6 носи лесни техники за мащабиране на вашето приложение. И все още е доверен избор от много големи играчи като Github, Shopify, Basecamp и други.
php unicode към utf 8
Трябва ли да използвам Rails?
Отговорът зависи от вашия случай на употреба. Все още е най-добрата рамка за редовна мрежа, електронна търговия, управление на съдържание и много други видове приложения. Той също така намалява времето за разработка на MVP и е чудесен избор, когато нямате фиксирана идея или се нуждаете от бърз прототип за вашето приложение.
Какво означава Upsert?
Upsert е операция с база данни, което означава, че въз основа на атрибутите, предоставени за операция, ако записът вече съществува в базата данни, тогава искаме да актуализираме този запис или да създадем нов запис, ако записът не съществува. Upsert се случва в една транзакция, като по този начин се предотвратяват всякакви състезателни условия в приложението.
Какви са предимствата на паралелното тестване?
Виждали сме проекти, при които са необходими часове, само за да стартираме тестовите случаи. Чрез стартиране на набор от тестови случаи в различни процеси можем да намалим времето за изпълнение на нашите тестови случаи. С паралелното тестване на Rails 6 няма да се налага да разчитаме на външни услуги, за да паралелизираме нашите тестови случаи.