Тут, в RubyGarage, ми тісно працюємо з технологіями Ruby та Ruby on Rails. Якщо уявити наш робочий процес як кухню, де ми "готуватимемо" додатки, то можна сказати, що наші розробники — це кухарі, Ruby — наша кулінарна книга, а Ruby on Rails — це наш частково приготований продукт: він вже наполовину готовий, тому нам не потрібно починати все з нуля. Нарешті, ми "приправляємо" наші додатки гемами — бібліотеками Ruby з певними функціональностями. Геми дозволяють нам розширювати і налаштовувати наші додатки.
Для цієї статті ми вибрали найкращі Ruby геми, які ми регулярно використовуємо у наших проектах і рекомендуємо. Насолоджуйтесь!
Active Record
Active Record — це стандартний ORM для Ruby on Rails. Хоча він пропонує багатий функціонал, деякі проекти потребують кастомних рішень або додаткових можливостей. Ми вибрали кілька гемів, які розширюють функціональність Active Record, роблячи його більш потужним, гнучким та універсальним.
Пагінація — Для пагінації спробуйте гем із загадковою назвою Kaminari, японське слово, що означає "гром". Kaminari — це гнучкий пагінатор з коробки (не потребує налаштування), який використовує скоупи для обробки запитів ActiveRecord.
Категоризація — Для покращення класифікації та структурування даних на блозі, новинному сайті чи соціальній мережі, вам може знадобитися додати теги. Гем ActsAsTaggableOn дозволяє тегувати об'єкти (моделі та контролери) за кількома атрибутами залежно від вмісту вашого додатку.
Клонування — Якщо вам потрібно створити копію об'єкта Active Record та його асоціацій, зверніть увагу на гем deep_cloneable, який додає метод до об'єктів для їх копіювання. Deep_cloneable дає точну копію з мінімальними зусиллями.
М'яке видалення — Paranoia, що замінює actsasparanoid, реалізує функцію м'якого видалення. Після виклику destroy для об'єкта Active Record, Paranoia не видаляє ці записи в базі даних. Замість цього цей гем приховує об'єкт, обмежуючи запити на модель. Для того, щоб справді видалити об'єкт Rails, вам потрібно використовувати метод really_destroy.
Конечні стани — AASM, що замінює плагін theactsasstate_machine, працює з будь-яким об'єктом Ruby, включаючи ActiveRecord. AASM додає кінцеві автомати станів (набори правил, які визначають, що додаток або пристрій повинні робити) до класів Ruby.
Версії — Гем PaperTrail дозволяє вам уникати розчарування, коли ви не можете скасувати або повторити зміни до своїх моделей. З PaperTrail ви можете створювати версії своїх моделей, додавати, скасовувати та повторювати поведінку, відновлювати дані, працювати з асоціаціями моделей і багато іншого.
Інтернаціоналізація — Коли мова йде про переклад вашого додатка на іноземні мови, Globalize, який використовує API I18n, стане в пригоді. Globalize додає переклади контенту вашого сайту до моделей ActiveRecord, що особливо корисно, коли ви працюєте з перекладом не статичних даних у базі даних.
Тестування
Якщо ви збираєтеся писати автоматизовані тести для своїх додатків (що є невід'ємною частиною розробки RoR додатків), є кілька гемів, які будуть корисні. Під час роботи над нашими проектами ми використовуємо RSpec, factorygirl, Capybara, shoulda-matchers, databasecleaner та simplecov для економії часу та зусиль.
Ми пишемо наші юніт-тести з використанням RSpec — фреймворку для тестування, який зазвичай використовується в середовищах BDD та TDD. Синтаксис RSpec акуратний і описовий, тому тести (або спек) пишуться якомога ближче до "людської" мови. RSpec є ефективним інструментом для тестування поведінки моделі або бібліотеки.
Database_cleaner часто використовується разом з RSpec для очищення баз даних під час тестів.
Гем Database_cleaner надає вам гнучкість налаштування, коли ваша база даних буде очищена: перед запуском тестів або як перед, так і після кожного тесту. І якщо ви зіткнетеся з проблемою зовнішніх запитів під час тестів, вам може знадобитися рішення, як-от VCR, який перехоплює всі зовнішні запити з відповідями та записує їх у файл, щоб ви могли "відтворити" їх під час тестування.
Для створення тестових даних ми використовуємо гем factory_girl. Factory_girl дозволяє створювати фабрики (набори даних) для моделей, щоб не вводити дані вручну щоразу, коли ви пишете юніт-тести. Ми також використовуємо інший гем під назвою Faker для генерації фейкових даних у наших моделях, таких як номери телефонів, електронні пошти та імена користувачів.
Далі ми використовуємо Capybara, фреймворк для приймальних тестів, який ефективно автоматизує взаємодії користувача в браузері. За допомогою Capybara ми можемо тестувати кліки, заповнення форм (поля вводу даних, випадаючі списки, прапорці), наявність елементів на сторінці та інше. У комплекті з Poltergeist, популярним драйвером PhantomJS, Capybara надає нам можливість запускати тестові сценарії у вебкиті з консолі.
Інший гем, shoulda-matchers, дозволяє легко тестувати типову функціональність Rails, таку як валідації та асоціації, пишучи компактні однорядкові тести, сумісні з RSpec. Іншими словами, shoulda-matchers пропонує матчери, які допомагають розробникам швидко та легко тестувати базову функціональність Rails.
Нарешті, гем simplecov дозволяє нам бачити відсоток коду, покритого юніт-тестами. Цей гем допомагає нам відстежувати, скільки коду ми протестували, та прагнути до кращих результатів (хоча досягти 100% покриття досить складно).
Стиль коду
Стиль коду має значення. Щоб писати якісний код, досвідчені Ruby-розробники дотримуються найкращих практик, зазначених у Ruby Style Guide. Але чому ж розробники так піклуються про стиль? Згідно з Ruby Style Guide, добре написаний Ruby код читається як природна мова і може бути зрозумілий навіть для людей, які не є розробниками. Крім того, добре написаний код легко підтримувати, змінювати та масштабувати.
Для забезпечення якості коду розробники використовують геми, які аналізують їх код і пропонують поліпшення. Давайте подивимось, які геми віддає перевагу наша команда RubyGarage.
Гем railsbestpractices — це інструмент для статичного аналізу коду, який знаходить "погані запахи" в коді: частини коду, які не є технічними помилками, але можуть призвести до проблем у програмному забезпеченні в майбутньому. Railsbestpractices пропонує поради щодо покращення коду — наприклад, пропонує видалити табуляції, анотацію моделей або додаткові індекси для бази даних. Ви можете поділитися результатами аналізу з вашими співробітниками та відстежувати результати протягом часу, щоб побачити, як покращується ваш код.
Ще один аналізатор коду з грізною назвою RuboCop забезпечує, що ваш код відповідає Ruby Style Guide. Шанувальники стилю обожнюють RuboCop, оскільки він не залишає шансів для порушень стилю — вони відразу ж відображаються в командному рядку. Деяким розробникам це може здатися досить набридливим, але ви можете налаштувати RuboCop, щоб він показував лише рекомендації щодо рефакторингу, які ви хочете. А чудова особливість RuboCop полягає в тому, що він автоматично виправляє проблеми, такі як розриви рядків, синтаксис і кількість пропусків.
Гем RubyCritic допомагає створювати звіти про якість коду. RubyCritic не залишає шансів для поганих запахів Ruby коду, генеруючи HTML-звіти з назвами файлів, їх запахами та рейтингами: файли отримують оцінки від «A» до «F».
Налагодження
Помилки трапляються постійно, коли ви пишете код. Будь то помилка в написанні або гем не інтегрується належним чином, ви отримуєте неприємні результати.
Щоб усунути ці проблеми, ми використовуємо кілька зручних інструментів для налагодження помилок у Ruby коді.
Сторінка помилок за замовчуванням у Rails досить проста, тому наші розробники віддають перевагу альтернативам. Better Errors пропонує статичну сторінку помилок для додатків на Rack, але вона дещо незручна, оскільки ви не можете побачити, що спричинило збої, окрім як через стек трасування. Натомість гем bindingofcaller пропонує більш корисну сторінку помилки та дозволяє перевіряти змінні у вашому додатку, коли він ламається.
Pry-byebug — ще один інструмент, який ми використовуємо, і він насправді розширює функціональність гемів Pry та Byebug. За допомогою pry-byebug ви можете реалізувати поетапне налагодження коду, встановлюючи точки зупину. Pry-byebug дозволяє встановлювати точки зупину в консолі (IRB або Rails console), щоб ви могли перевірити, як виконується частина коду на певному етапі.
Насамкінець, варто згадати гем Letter Opener, який дозволяє вам переглядати електронні листи, надіслані з додатку, прямо в вкладці вашого браузера. Це дуже корисно для додатків, які надсилають електронні листи (наприклад, сповіщення) багатьом користувачам або в ситуаціях, коли вам потрібно швидко переглянути електронний лист. З Letter Opener вам не потрібно чекати, поки лист буде доставлений на вашу поштову скриньку, ви можете швидко переглядати листи у браузері і вносити зміни, якщо це необхідно.
Аутентифікація та авторизація
Незалежно від того, чи будуєте ви соціальну мережу, рішення для електронної комерції, чи будь-який інший тип додатку, вам зазвичай потрібно надавати функціональність входу, що означає необхідність аутентифікації та авторизації. Деякі розробники віддають перевагу написанню власних рішень для аутентифікації та авторизації користувачів, але деякі використовують готові геми, які економлять купу часу та зусиль.
Важко знайти Ruby-розробника, який не чув про гем Devise. Цей величезний гем, заснований на стеку Rails MVC, додає підтримку OmniAuth для перевірки користувачів, скидання паролів за потреби та збереження паролів у базі даних для спрощення аутентифікації. Крім того, Devise відслідковує метрики, включаючи IP-адреси та часові мітки, закінчує сесії користувачів після певного періоду часу і блокує акаунти у разі кількох невдалих спроб входу. Devise може зробити ще більше — перегляньте їх сторінку на GitHub для деталей.
Вхід на сайти через соціальні акаунти, такі як Facebook або LinkedIn, є звичайною практикою, яка економить час і нерви користувачів. Як правило, соціальний вхід у додатках Rails підтримується гемом OmniAuth, який створює провайдерів аутентифікації (для соціальних мереж, включаючи Facebook, Google і навіть GitHub), які інтегруються в додаток Rails. Легко, як пиріжок!
Ще одна корисна бібліотека — Rolify, яка дозволяє встановлювати та керувати ролями користувачів — визначеннями того, що користувачі можуть робити під час використання додатку. Наприклад, коли ви будуєте ринок, як-от Airbnb, ви, ймовірно, визначите дві ролі користувачів: хости, які надають свої квартири в оренду, та користувачі, які орендують квартири і отримують зовсім інший набір функцій. Rolify також легко інтегрується з CanCanCan та Devise для розширення можливостей керування користувачами.
Коли ви будуєте складні додатки, в яких користувачі мають кілька ролей, можливо, вам захочеться встановити обмеження доступу для певних ролей користувачів. У такому разі гем CanCanCan дозволяє визначати можливості конкретних користувачів в одному місці, що наша команда RubyGarage вважає дуже зручним.
API
В двох словах, API — це набір вимог для обміну даними між додатками.
Ви можете увійти в онлайн-магазини за допомогою вашого акаунту Facebook завдяки API, або шукати ресторани поблизу через Foursquare за допомогою Google Maps — також завдяки API. Створення API іноді може бути складним, але в інших випадках достатньо кількох рядків коду.
Завдяки багатьом існуючим Ruby гемам для API, вам не доведеться винаходити колесо. Один чудовий інструмент для заощадження часу — це гем під назвою ActiveModelSerializers, який створює JSON відповідь з сервера в залежності від переданого запису або колекції. Ми також користуємося гемом Apipie-rails — DSL для документування RESTful API. Apipie буквально описує код за допомогою синтаксису Ruby, що зручно для ruby-розробників.
Безпека
При розробці додатків, які зберігають особисту інформацію користувачів або фінансові дані, важливо забезпечити безпеку даних.
Brakeman — це статичний сканер безпеки, який виявляє вразливості в додатках на Rails. Хоча він може повідомляти про вразливості навіть тоді, коли їх немає (оскільки він статичний), ви можете легко налаштувати список попереджень, щоб не отримувати непотрібних сповіщень.
Якщо ви хочете перевірити геми вашого додатку на наявність вразливостей, зверніть увагу на bundler-audit, який працює поверх Bundler. З bundler-audit ви зможете спокійно спати та заощаджувати багато часу, не перевіряючи кожен окремий гем у вашому додатку на Rails, оскільки bundler-audit перевіряє ваш gemfile.lock на наявність вразливих версій гемів і запобігає ненадійним завантаженням гемів.
Гем, який відповідає за застосування HTTP заголовків, пов’язаних із безпекою, до відповідей Rails додатків — це Secure Headers. Secure Headers дозволяє вам застосовувати такі заголовки, як CSP для запобігання атакам типу Cross-Site Scripting (XSS) і Mixed-Content, а також XFO для запобігання атакам Clickjacking.
Платежі
Якщо ви розробляєте рішення для електронної комерції, вам обов'язково потрібно надати швидкі, безпечні та зручні варіанти оплати.
Active Merchant — це бібліотека від творців Shopify, яка надає централізований API для інтеграції з багатьма популярними платіжними шлюзами. Ця бібліотека з відкритим кодом добре підтримується командою Shopify і на даний момент підтримує 145 платіжних шлюзів, доступних по всьому світу.
В RubyGarage ми віддаємо перевагу роботі з популярними шлюзами, такими як PayPal, Stripe і Braintree. Але навіть хоча Active Merchant обробляє інтеграцію Stripe і Braintree, ми часто використовуємо Braintree Ruby та Stripe Ruby Bindings, щоб забезпечити легкі рішення для наших додатків. Оскільки Active Merchant є великою бібліотекою, яка може уповільнити продуктивність додатка, ефективніше інтегрувати кілька платіжних шлюзів і не перевантажувати додаток.
Деплоймент
Деплоймент — важливий етап життєвого циклу розробки програмного забезпечення, коли ми готуємо ваш веб-додаток до запуску. Існує безліч веб-серверів, які можуть хостити веб-додатки на Rails. Наприклад, Puma і Unicorn — популярні HTTP веб-сервери, які часто використовуються для деплойменту додатків на Rails. І коли справа доходить до деплойменту веб-додатків на ці конкретні сервери, ми просто використовуємо геми Puma та unicorn-rails Ruby gems.
Веб-додаток проходить через кілька етапів перед деплойментом, включаючи копіювання файлів, міграцію баз даних та компіляцію активів. Ці нудні завдання можна виконати за допомогою автоматизованого інструмента для деплойменту — Capistrano.
Capistrano обробляє багато операцій, включаючи тегування серверів для різних ролей, обробку кількох етапів і виконання паралельних деплойментів. Capistrano ефективно працює з Chef, який налаштовує та керує сервером, встановлюючи пакети, розміщуючи файли у зазначених місцях тощо. Chef рідко використовується для деплойменту додатків на Rails, оскільки він має обмежені можливості для налаштування та автоматизованого деплойменту.
Завантаження файлів
Досить часто ми розробляємо веб-додатки, що дозволяють користувачам завантажувати файли різного типу: документи, зображення, аудіо та відео. І коли мова йде саме про зображення, одне з найбільш ефективних рішень — це гем CarrierWave. CarrierWave функціонує як завантажувач файлів, а також як обробник зображень, який обрізає та змінює розмір зображень. Крім того, CarrierWave кешує файли (щоб користувач не змушений був завантажувати файл знову, якщо щось піде не так) та обробляє файли, щоб ви могли витягувати EXIF-дані або розбирати завантажені текстові файли. Гарною перевагою CarrierWave є те, що він зберігає всі дані в класах завантажувачів, тому ваш код залишається чистим та акуратним.
Minimagick — ще один гем, який обробляє зображення. Minimagick ефективно зберігає ваші ресурси оперативної пам'яті та виконує різні завдання, такі як зміна розміру зображень, перевертання, обертання, розмивання, а також конвертування в популярні формати зображень, включаючи PNG.
Нарешті, ви можете захотіти завантажити та зберігати файли на зовнішніх серверах, таких як Amazon S3 або Google Cloud Storage. У такому випадку ми використовуємо гем Fog, який працює з різними хмарними сервісами, включаючи AWS, Rackspace Servers і Brightbox.
Заплановані та повторювані завдання
Фонові завдання в додатках на Ruby обробляються поза звичайним потоком запит/відповідь і фактично є операціями в черзі, які виконуються одна за одною. Обробка фонового завдання критично важлива для продуктивності додатка. Для наочного прикладу, уявімо, що ми створюємо додаток, який відправляє електронний лист користувачеві після реєстрації. Очевидно, лист повинен бути доставлений якнайшвидше: ми всі ненавидимо чекати дві або три секунди, очікуючи, що повідомлення з'явиться в нашій поштовій скриньці. Щоб прискорити цей процес, нам потрібно використовувати фонові завдання для таких операцій, як відправка електронних листів, імпорт даних, виклики сторонніх API і зміна розміру зображень.
Наприклад, для запланованих завдань команда RubyGarage використовує бібліотеку Sidekiq, яка підтримує Redis та використовує Redis як сховище для керування завданнями. Цей гем вражає розробників своїми можливостями багатозадачності, що дає вражаючу швидкість. Інші переваги включають зручне моніторинг стану обробки завдань і можливість виконувати завдання паралельно.
Наступним популярним інструментом для обробки фонового процесу є Resque. Resque — це потужний інструмент для керування фоновими завданнями, який дуже схожий на Sidekiq. Однак Resque та Sidekiq виконують фонові завдання різними способами. Resque використовує лише однониткові процеси, в той час як Sidekiq обробляє багатониткові процеси, тому для Resque потрібно більше пам'яті для обробки черг.
Ще одним корисним інструментом для обробки фонового процесу є Sucker Punch, натхненний гемом girl_friday. Sucker Punch відрізняється від подібних рішень тим, що працює всередині процесу додатка, тому не потребує додаткових залежностей (як Sidekiq потребує Redis). За словами GitHub, Sucker Punch ефективно працює з маленькими завданнями, такими як обробка журналів та електронних листів, але в разі збоїв системи, коли ваш додаток перезавантажується, фонові завдання будуть втрачені.
Пошук
Більшість веб-додатків вимагають вбудованої функціональності пошуку. Щоб забезпечити пошукову функцію у вашому додатку, вам варто звернути увагу на кілька корисних гемів.
Elasticsearch — популярний пошуковий движок для підприємств.
Завдяки Elasticsearch ви можете реалізувати пошук на вебсайті, індексувати каталоги товарів (якщо ви керуєте інтернет-магазином), автоматично додавати дані, розробити рішення для сповіщень про ціни, індексувавши ціни, реалізувати зворотний пошук, зберігати транзакції та дії, а також аналізувати та отримувати дані для отримання комплексної статистики. Ми використовуємо гем Elasticsearch для інтеграцій з Ruby у додатках Rails.
Інший гем, який підключає Active Record до повнотекстового пошукового інструменту під назвою Sphinx, — це Thinking Sphinx. Завдяки Thinking Sphinx ви можете використовувати можливості Sphinx, такі як демон пошуку, консольний аналог для налагодження та тестування пошуку, індексацію та багато іншого.
"Чудово", "відмінно", "вражаюче" — ось слова, якими наші розробники описують Ransack gem. Ransack цінується розробниками Ruby, оскільки він допомагає створювати розумні і прості, але водночас потужні форми пошуку. На жаль, цей гем наразі не підтримується на GitHub. Але це не зупиняє його популярність.
Нарешті, для увімкнення повнотекстового пошуку в базі даних PostgreSQL ми використовуємо гем PgSearch.
Змінні середовища
Зберігання конфігурацій додатка в змінних середовища є широко використовуваною практикою, яка походить від принципу застосунку за дванадцятьма факторами; таким чином, ви можете зберігати чутливі дані, як паролі чи API-ключі, поза репозиторієм коду, але ці дані залишаються доступними під час виконання. Однак іноді не ефективно налаштовувати змінні середовища на розробницькому комп'ютері чи сервері безперервної інтеграції для запуску кількох проектів. Гем Dotenv завантажує змінні середовища з dot-файлу, який можна розмістити поза коренем вашого проекту. Тому ви можете зберігати секрети вашого додатка в безпеці.
Панель адміністратора
Як власник або адміністратор вебсайту, вам потрібна панель керування, де ви зможете управляти вашим вебсайтом. У світі Ruby двома найбільш популярними інструментами для адміністрування є Active Admin і RailsAdmin. Обидва інструменти, Active Admin та RailsAdmin, надають користувачам вбудовані функції, включаючи експорт даних у CSV, JSON та XML, кастомний пошук і фільтрацію за типами, а також кастомну аутентифікацію та авторизацію для розподілу ролей користувачів. Хоча ці адміністраторські геми мають багато спільних функцій, вони насправді досить різні. Загалом, RailsAdmin готовий до використання відразу після установки, тоді як Active Admin вимагає ручних модифікацій та налаштувань, оскільки він має свою власну модель/контролерну схему.
Ще один Administrate гем стане в пригоді, коли необхідно замінити Active Admin і RailsAdmin. Administrate генерує панелі адміністратора, які легко налаштувати навіть для технічно непідготовлених користувачів, що є типовою проблемою для всіх панелей адміністратора, які є занадто загальними.
View Helper
Нещодавно тенденція полягає в тому, щоб тримати моделі, уявлення та контролери якомога більш легкими. Тож як нам зберігати все легким? View Helpers — це модулі, які містять методи для допомоги у написанні DRY (Don’t Repeat Yourself), чистого та підтримуваного коду. Розглянемо кілька гемів, які заощаджують велику кількість часу нашим розробникам у RubyGarage.
У Rails ми маємо об'єкти всюди. Draper — це гем-декоратор, який додає об'єктно-орієнтовану презентацію вашому веб-додатку.
Якщо ви вважаєте логіку у своїх шаблонах і допоміжних класах надто складною, то цей гем може бути саме тим, що вам потрібно — Draper допомагає вам впорядкувати код за допомогою більш об'єктно-орієнтованого підходу, додаючи, замінюючи або розширюючи поведінку об'єкта.
Simple Form — це гем, який робить те, що й говориться в його назві: він допомагає створювати форми для ваших додатків Rails. Коротко кажучи, Simple Form допомагає розробникам писати елегантніший код, а також швидко створювати випадаючі списки та пропонує неймовірну гнучкість при роботі з прапорцями (checkboxes) та радіо кнопками (radio buttons). Він навіть може допомогти вам у міжнародалізації елементів форм.
Ще одним корисним гемо є MetaTags, який допомагає вам створювати SEO-дружні додатки Rails, додаючи допоміжні методи для мета-тегів. MetaTags робить управління SEO ефективнішим, надаючи більш простий спосіб створення мета-тегів, дотримуючись при цьому SEO найкращих практик.
Нарешті, при розробці рішення для електронної комерції, нам потрібно враховувати гроші та конвертацію валют. Гем Money-Rails вирішує ці завдання у вашому додатку Rails через інтеграцію з гемом Money. Гем Money-Rails надає ряд переваг перед Money, таких як клас money, монетарні значення та конвертація валют. Крім того, ви можете створювати елегантні поля для введення грошей, які автоматично діляться на сотні та тисячі з десятковими роздільниками.
Висновок
Використання гемів Ruby є стандартною практикою при роботі з додатками Ruby on Rails. Геми вирішують поширені проблеми в Rails-додатках, включаючи завантаження файлів, аутентифікацію, авторизацію та тестування. Геми Ruby також усувають необхідність вигадувати колесо та створювати власні рішення для кожного унікального додатка. Проте слід пам'ятати, що геми — це не срібна куля для всіх ваших проблем. Геми більше схожі на заморожену їжу з магазину; вони здебільшого готові до використання, але ви не можете їсти їх прямо з коробки. Використовуйте геми часто, але не забувайте подавати їх правильно!
Оригінально опубліковано на rubygarage.org.
Перекладено з: 57 Best Ruby Gems We Use at RubyGarage