Ruby On Rails был краеугольным камнем в веб-разработке с момента своего основания, позволяя разработчикам создавать масштабируемые и поддерживаемые веб-приложения. С эволюцией Rails каждая версия вводила новые функции, улучшения производительности и безопасности. Поскольку Rails имеет открытый исходный код, разработчики постоянно решали существующие проблемы и добавляли улучшения, поддерживая фреймворк в соответствии с новыми трендами. Итак, давайте рассмотрим путь Rails как фреймворка от зарождения до последних достижений.
Рождение Rails (2004): Почему Rails был создан
В начале 2000-х годов создание веб-приложений часто было утомительным и требовало повторяющегося кода для обработки взаимодействий с базой данных и логики приложения. Дэвид Хайнемайер Ханссон (DHH), разрабатывая Basecamp, осознал необходимость в фреймворке, который акцентировал бы внимание на соглашениях, а не на конфигурации (convention over configuration), и на счастье разработчиков.
-
Основа философии Rails:
DRY (Don't Repeat Yourself): Сократить повторение кода путем вынесения поторяющихся паттернов в абстракции;
Соглашение вместо конфигурации (Convention Over Configuration): предоставить разумные стандартные настройки, чтобы минимизировать количество конфигураций
Фулл-стек фреймворк: предложить инструменты для всего процесса разработки, от миграций базы данных до управления ассетами на фронт-энде
Rails был рожден для оптимизации веб-разработки путём уменьшения количества шаблонного кода и предложения структуризированного, но в то же время гибкого фреймворка.
Rails 1 (2005): Начало простоты
Rails 1 представил миру свежий и революционный путь постоения веб-приложений, фокусируясь на продуктивности разработчика и простоте использования.
-
Ключевые изменения:
-
ActiveRecord: ORM для управления записями в базе данных;
-
Scaffolding: автоматически генерируемые модели, представления (views) и контроллеры, ускоряющие прототипирование;
-
Миграции: упрощенные изменения схемы базы данных, сокращающие ручное написание SQL кода;
-
Вспомогательные методы (Helper Methods): рекомендуется разделение кода для более чистых представлений и лучшей поддерживаемости;
-
Интегрированное тестирование: тестирование стало существенной частью Rails, оптимизируя процесс TDD.
-
Rails 1 стал хорошим началом. В 2006, он (фреймворк) выиграл награду "Язык года" от Tiobe. Однако затем команда разработки столкнулась с некоторыми проблемами. Среди них:
-
Ограниченная масштабируемость больших приложений;
-
Отсутствие RESTful маршрутизации привело к дезорганизации контроллеров;
-
Уязвимости безопасности, такие как риски массового присвоения (mass assignment), были распространены.
Это привело к новой версии - Rails 2.
Rails 2 (2007): Укрепление фундамента
Rails 2 укрепило фреймворк улучшением масштабируемости, представив RESTful дизайн и улучшив безопасность.
-
Ключевые изменения:
-
RESTful маршрутизация: было упрощено и стандартизовано то, как приложения обрабатывали URL'ы и контроллеры;
-
Генераторы ресурсов: был улучшен scaffolding для соответствия RESTful архитектуре;
-
HTTP кэширование: улучшена производительность путем добавления встроенных механизмов кэширования в HTTP;
-
Улучшения безопасности: была представлена защита от CSRF, чтобы предотвратить атаки с межсайтовой подделкой запросов;
-
Гемы и плагины: Упрощено добавление сторонных библиотек и плагинов.
-
-
Примечательные методы/фичи:
named_scope =>
для создания цепочки методов запросов к базе данных;before_filter => (позже before_action)
для реализации DRY принципа в методах контроллеровrespond_to =>
для реализации множества форматов ответа сервера (HTML, JSON, XML).
Популярность Rails в этот момент начала расти. Некоторые из наиболее популярных приложений (Twitter, Hulu, Shopify) начали использовать его как основной фреймворк.
23 декабря 2008 был запущен Merb, еще один фреймворк для создания веб-приложений. Он был очень похож на Rails, что вызвало множество столкновений в сообществах обоих фреймворков. Однако, в это время команда Rails работала с Merb и Merb был объединен с Rails.
Однако у системы были свои недостатки. Плагинам и гемам недоставало стандартизации, проблемы производительности в сложных запросах становились болью, и ручная обработка состояний и сложной логики моделей вызывала трудности.
Rails 3 (2010): Консолидация и модуляризация
Rails 3 ознаменовал поворотный момент в истории Rails, объединив разрозненные компоненты в единую структуру. Эта версия положила основу в современный Rails, оптимизируя разработку и улучшая производительность.
-
Ключевые изменения:
-
Слияние компонентов Rails: унифицированные компоненты Rails (ActionPack, ActiveModel и т.д.) объединены во фреймворке, чтобы снизить фрагментированность и улучшить поддерживаемость;
-
ActiveRelation: "прокачивание" запросов ActiveRecord путем формирования цепочек методов, улучшения читаемости и производительности;
-
Рефакторинг валидаций: извлечены и обёрнуты в модули валидации ActiveRecord, что позволило переиспользовать их вне ActiveRecord для большей гибкости;
-
Улучшения маршрутизации: упрощенные описания маршрутов с новым DSL удовлетворили потребность в более понятной и организованной маршрутизации;
-
Защита от XSS "из коробки": усилена безопасность по умолчанию для борьбы с ростом количества XSS уязвимостей.
-
-
Примечательные методы / фичи:
where
: метод ActiveRecord для упрощения сложных запросов;respond_to
: был улучшен для обработки нескольких форматов более элегантно.Добавлен asset pipeline (Rails 3.1), чтобы стандартизировать управление JavaScript, CSS, что решило проблему масштабирования фронт-энд ассетов.
В свою очередь, эти изменения стали причиной нового набора проблем. Asset pipeline добавил сложности в процессы разработки. Проблемы с производительностью начали проявляться в масштабных развертываниях приложения, а обработка фоновых задач была ограниченной.
Rails 4 (2013): Улучшения конвенций и производительности
Основываясь на фундаменте Rails 3, Rails 4 улучшил производительность, безопасность, ввёл конвенции, сделавшией приложения более надежными.
-
Ключевые изменения:
-
Strong-параметры: добавлены чтобы предотвратить уязвимости массового присвоения, последовавшие за возросшим беспокойством о подделке параметров;
-
Turbolinks: улучшена производительность с помощью загрузки отдельных частей HTML вместо полной перезагрузки страницы, что решает проблемы медленной навигации
-
Фоновые задачи:
ActiveJob
был введён как уровень абстракции, предлагая стандартизированную обработку фоновых задач разными обработчиками; -
Улучшения ActionMailer: упрощены шаблоны электронных писем добавлен предварительный просмотр для продуктивности разработчика;
-
Concerns: рекомендуется отделение общей логики в
concerns
, что помогает в организации кода и сокращает раздувание модели.
-
-
Примечательные методы / фичи:
belongs_to
ассоциации стали обязательными по умолчанию для предотвращения проблем с целостностью данныхenum
для ActiveRecord для управления состоянием с помощью целочисленных отображений, отвечающее потребности более простого управления состояниемhas_secure_password
включен в ActiveModel, чтобы упростить процесс аутентификации
В этой версии turbolinks внес несогласованность в сложные JavaScript приложения, производительность asset pipeline'ов замедлилась с ростом приложений. Зависимость обработчиков фоновых задач от Redis усложнила инфраструктуру. Это вызвало потребность в новой версии Rails, Rails 5.
Rails 5 (2016): API режим и Real-Time фичи
Rails 5 удоавлетворил растущую потребность в API и real-time фичах, подготовив сцену для интерактивных и масштабируемых приложений.
-
Ключевые изменения:
-
API режим:
rails new app --api
представил легковесные API-only Rails приложения, что было обусловлено ростом популярности мобильных и одностраничных приложений; -
ActionCable: интегрированная поддержка WebSocket для реализации функций реального времени, отвечающая запросу на обмен данными в реальном времени и функционал чатов;
-
ActiveRecord Attributes API: добавлена кастомизация поведения атрибутов и типов, сделавшая ActiveRecord более гибким;
-
Turbolinks 5: Расширенная поддержка нативных мобильных приложений, уменьшающая время загрузки и улучшающая мобильную разработку;
-
Переименование контроллеров: разделение
ApplicationController
наAPIController
иBaseController
для оптимизации разработки API.
-
-
Примечательные методы / фичи:
Добавлены хуки
after_commit
иafter_rollback
для более точного контроля транзакций в базе данныхrails db:setup объединил первоначальную настройку базы данных со схемой и начальными данными в одну команду.
В то время, как Rails 5 привнёс режим API, множество приложений все еще сталкивалось с проблемами в разделении монолитных структур, что приводило к проблемам с производительностью в больших приложениях. Хотя ActionCable и был добавлен, WebSocket'ы приводили к сложностям с масштабируемостью и развертыванием. Также отсутствие единого способа управления очередями фоновых задач вело к несогласованности и зависимости от множества гемов. Иммено тогда был представлен Rails 6.
Rails 6 (2019): Продуктивность и масштабируемость
Rails 6 сфокусировался на улучшении продуктивности разработчика и масштабируемости, обеспечивая, чтобы Rails приложения могли соответствовать современным требованиям.
-
Ключевые изменения:
-
ActionText: представлен для манипуляций с расширенным текстовым контентом, отвечая потребности в интегрированном, user-friendly редактировании текста;
-
Множество баз данных: нативная поддержка множества баз данных для обеспечения горизонтальной масштабируемости приложений;
-
Параллельное тестирование: запуск тестов параллельно уменьшил время прогона тестов, отвечая потребности в более быстрых циклах разработки;
-
Webpacker по умолчанию: менеджмент JavaScript'a перенесено на Webpack, для соответствия современным фронт-энд инструментам;
-
ActionMailbox: позволил обрабатывать входящие имейлы прямо в Rails моделях, упростив работу с ними
-
-
Примечательные методы / фичи:
Метод
has_rich_text
упрощает управление большими текстамиrails db:system:change
позволяет бесшовно сменить базу данныхУлучшена производительность ассоциаций
has_many :through
В Rails 6 Sprockets становился все более и более медленным для больших приложений, вызывая замедления в производительности. Webpacker улучшил управление ассетами, но его конфигурация была сложной и становилась причиной ошибок. Обновление до более новых версий стало проблемой из за ошибок Webpack. Также, несмотря на то, что была добавлена поддержка нескольких баз данных, кэширование и улучшение производительности все еще требовало значительного ручного вмешательства.
Rails 7 (2021): Фулл-стек разработка и простота
Rails 7 упростил фулл-стек разработку минимизировав JavaScript-зависимости и предлагая более сконцентрированный на Rails подход.
-
Ключевые изменения:
-
Import Maps: Исключили потребность в Node.js или Webpack для JavaScript, упрощая управление ассетами на фронт-энде;
-
Интеграция Hotwire: привнесла Turbo и Stimulus, продвигая минимальное количество JavaScript для более быстрых взаимодействий на фронт-энде;
-
Асинхронные запросы к БД: добавлены асинхронные ActiveRecord запросы к базе данных для обработки длительных операций;
-
Zeitwerk по умолчанию: улучшена автозагрузка, решающая проблему производительности во время запуска приложения;
-
Обновления безопасности: усилена CSRF защита для смягчения растущих векторов атак;
-
-
Примечательные методы / фичи:
config.load_defaults 7.0
упрощает обновление до новых значений по умолчаниюrails new app --css=tailwind
упростил интеграцию с Tailwind CSSДобавлено встроенное шифрование для конфиденциальных атрибутов ActiveRecord.
До нынешнего момента обработка фоновых задач сильно полагалась на Redis, увеличивая стоимость и сложность инфраструктуры. Отсутствие встроенной аутентификации привело к зависимости от Devise или кастомных имплементаций, ведущих к переусложнению проекта.
Rails 8 (2024): Эффективность, простота и новые инструменты развертывания
Rails 8 представляет набор функций, отдающих приоритет оперативности развертывания приложения, более компактным конфигурациям и бесшовной аутентификации.
-
Ключевые изменения:
-
Развертывание без усилий: интеграция с Kamal 2 и Thruster упрощает процессы развертывания;
-
SolidQueue для фоновых задач: заменяет Redis, позволяя ActiveJob обрабатывать фоновые задачи не полагаясь на внешние системы;
-
Propshaft Asset Pipeline: более легкая альтернатива Sprockets, упрощающая управление ассетами;
-
Встроенная аутентификация: аутентификация "из коробки", уменьшающая зависимость от внешних гемов вроде Devise;
-
Папка скриптов и генератор: новая
script
директория для организации кастомных скриптов и упрощенный генератор для создания шаблонного кода быстрее;
-
-
Примечательные методы / фичи:
Метод
authenticate
прямо в контроллерах для управления сессиейКоманда
deploy
для бесшовной интеграцииpropshaft.append_path
для кастомизации менеджмента ассетов
Заключение
Rails вырос от простого веб-фреймворка до мощного, масштабируемого решения для современных веб-приложений. Каждая версия отвечает эволюционирующим требованиям разработчиков. Не важно, поддерживаете ли вы Rails 3 приложение или создаете новое Rails 7, понимание пути помогает вам создавать приложения быстрее, лучше и более безопасно. Кроме того, будущее Rails указывает на разработку на основе ИИ и передовые технологии, такие как WebAssembly. Так что следите за последними обновлениями.
Автор: J4sTFly