Ruby on Rails (упрощенно Rails ) — это платформа серверных веб-приложений , написанная на Ruby под лицензией MIT . Rails — это фреймворк модель-представление-контроллер (MVC), предоставляющий структуры по умолчанию для базы данных , веб-сервиса и веб-страниц . Он поощряет и облегчает использование веб-стандартов , таких как JSON или XML для передачи данных, а также HTML , CSS и JavaScript для взаимодействия с пользователем. В дополнение к MVC, Rails подчеркивает использование других известных шаблонов и парадигм разработки программного обеспечения , включая соглашение о конфигурации (CoC), «не повторяйся» (DRY) и шаблон активной записи . [4]
Появление Ruby on Rails в 2005 году сильно повлияло на разработку веб-приложений благодаря инновационным функциям, таким как плавное создание таблиц базы данных , миграция и формирование представлений, обеспечивающих быструю разработку приложений. Влияние Ruby on Rails на другие веб-фреймворки остается очевидным и сегодня: многие фреймворки на других языках заимствовали его идеи, включая Django в Python ; Катализатор на Perl ; Laravel , CakePHP и Yii на PHP ; Грааль в Groovy ; Феникс в Эликсире ; Играть в Scala ; и Sails.js в Node.js. _
К известным сайтам, использующим Ruby on Rails, относятся Airbnb , Crunchbase , Dribbble , [5] GitHub , [6] Twitch [7] и Shopify .
Дэвид Хайнемайер Ханссон извлек Ruby on Rails из своей работы над инструментом управления проектами Basecamp в компании веб-приложений 37signals . [8] Ханссон впервые выпустил Rails с открытым исходным кодом в июле 2004 года, но не делился правами на принятие обязательств по проекту до февраля 2005 года . с Mac OS X v10.5 «Leopard» [9] , выпущенной в октябре 2007 года.
Версия Rails 2.3 была выпущена 15 марта 2009 года и содержала важные новые разработки в шаблонах, движках, Rack и формах вложенных моделей. Шаблоны позволяют разработчику создавать скелет приложения с настраиваемыми драгоценными камнями и конфигурациями. Механизмы дают разработчикам возможность повторно использовать части приложения вместе с маршрутами, путями просмотра и моделями. Интерфейс веб-сервера Rack и Metal позволяют писать оптимизированные фрагменты кода, которые обрабатываются вокруг Action Controller. [10]
23 декабря 2008 года был запущен Merb , еще один фреймворк веб-приложений, и Ruby on Rails объявил, что будет работать с проектом Merb, чтобы воплотить «лучшие идеи Merb» в Rails 3, положив конец «ненужному дублированию» в обоих сообществах. . [11] Merb был объединен с Rails в рамках выпуска Rails 3.0. [12] [13]
Rails 3.1 был выпущен 31 августа 2011 года и включает в себя обратимую миграцию баз данных, конвейер активов, потоковую передачу, jQuery в качестве библиотеки JavaScript по умолчанию, а также недавно добавленные в стек CoffeeScript и Sass . [14]
Rails 3.2 был выпущен 20 января 2012 года с более быстрым режимом разработки и механизмом маршрутизации (также известным как механизм Journey), автоматическим объяснением запросов и ведением журнала с тегами. [15] Rails 3.2.x — последняя версия, поддерживающая Ruby 1.8.7. [16] Rails 3.2.12 поддерживает Ruby 2.0. [17]
Rails 4.0 был выпущен 25 июня 2013 года и представил Russian Doll Caching, Turbolinks, Live Streaming, а также сделал Active Resource, Active Record Observer и другие компоненты необязательными, разделив их как драгоценные камни. [18]
Rails 4.1 был выпущен 8 апреля 2014 года и представил Spring, Variants, Enums, предварительные версии Mailer и secrets.yml. [19]
Rails 4.2 был выпущен 19 декабря 2014 года и представил Active Job, асинхронную электронную почту, Adequate Record, веб-консоль и внешние ключи . [20]
Rails 5.0 был выпущен 30 июня 2016 года и представил Action Cable, режим API и Turbolinks 5. [21]
Rails 5.0.0.1 был выпущен 10 августа 2016 года с эксклюзивным использованием Rails CLI поверх Rake и поддержкой Ruby версии 2.2.2 и выше.
Rails 5.1 был выпущен 27 апреля 2017 года и внес изменения в интеграцию JavaScript (управление зависимостями JavaScript из NPM через Yarn, необязательная компиляция JavaScript с использованием Webpack и переписывание Rails UJS для использования стандартного JavaScript вместо зависимости от jQuery), системные тесты использование Capybara , зашифрованных секретов, параметризованных почтовых программ, прямых и разрешенных маршрутов, а также унифицированного помощника form_with, заменяющего помощники form_tag/form_for. [22]
Rails 5.2 был выпущен 9 апреля 2018 года и представил новые функции, в том числе ActiveStorage, встроенное хранилище кэша Redis, обновленные учетные данные Rails и новый DSL, который позволяет настраивать политику безопасности контента для приложения. [23]
Rails 5.2.2 был выпущен 4 декабря 2018 года и содержит множество исправлений ошибок и несколько улучшений логики. [24]
Rails 6.0 был выпущен 16 августа 2019 года, в котором Webpack стал использоваться по умолчанию, была добавлена маршрутизация почтовых ящиков, онлайн-редактор форматированного текста по умолчанию , параллельное тестирование, поддержка нескольких баз данных, маршрутизация почтовых рассылок и новый автозагрузчик. [25]
Rails 6.1 был выпущен 9 декабря 2020 года, в него добавлено переключение соединений для каждой базы данных, горизонтальное сегментирование базы данных , быстрая загрузка всех ассоциаций, делегированные типы в качестве альтернативы однотабличному наследованию, асинхронное удаление ассоциаций, объектов ошибок и другие улучшения и исправление ошибок. [26]
Rails 7.0 был выпущен 15 декабря 2021 года, в нем Node.js и Webpack заменены картами импорта для управления JavaScript по умолчанию, Turbolinks заменена комбинацией Turbo и Stimulus, добавлено шифрование на работе в Active Record, использование Zeitwerk исключительно для загрузки кода. , и более. [27]
Rails 7.1 был выпущен 5 октября 2023 г., Dockerfiles поддерживает использование Kamal для развертывания вашего приложения, улучшения аутентификации, а теперь включает поддержку Bun . [28]
Ruby on Rails радикально развивается от выпуска к выпуску, исследуя использование новых технологий и внедряя новые стандарты в Интернете. Некоторые функции Ruby on Rails очень стабильны, а некоторые заменены новыми технологиями.
Шаблон модель-представление-контроллер (MVC) является фундаментальной структурой для организации программирования приложений.
В конфигурации по умолчанию модель в платформе Ruby on Rails сопоставляется с таблицей в базе данных и файлом Ruby. Например, класс модели User обычно определяется в файле user.rb в каталоге app/models и связан с таблицей users в базе данных. Хотя разработчики могут игнорировать это соглашение и выбирать разные имена для своих моделей, файлов и таблиц базы данных, это не является общепринятой практикой и обычно не рекомендуется в соответствии с философией « соглашение важнее конфигурации ».
Контроллер — это серверный компонент Rails, который отвечает на внешние запросы веб-сервера к приложению, определяя, какой файл представления следует отображать . Контроллеру также может потребоваться запросить информацию у одной или нескольких моделей и передать ее представлению. Например, в системе бронирования авиабилетов контроллеру, реализующему функцию поиска рейсов, потребуется запросить модель, представляющую отдельные рейсы, чтобы найти рейсы, соответствующие поиску, а также может потребоваться запросить модели, представляющие аэропорты и авиакомпании, для поиска связанных вторичных данных. Затем контроллер может передать некоторое подмножество полетных данных соответствующему представлению, которое будет содержать смесь статического HTML и логики, которая использует полетные данные для создания HTML-документа, содержащего таблицу с одной строкой на каждый полет. Контроллер может обеспечить одно или несколько действий. В Ruby on Rails действие обычно представляет собой базовую единицу, описывающую, как ответить на конкретный внешний запрос веб-браузера. Также обратите внимание, что контроллер/действие будет доступен для внешних веб-запросов только в том случае, если ему сопоставлен соответствующий маршрут. Rails рекомендует разработчикам использовать маршруты RESTful , которые включают в себя такие действия, как создание, создание, редактирование, обновление, уничтожение, отображение и индексирование. Эти сопоставления входящих запросов/маршрутов с действиями контроллера можно легко настроить в файле конфигурации router.rb.
Представление в конфигурации Rails по умолчанию представляет собой файл erb , который оценивается и преобразуется в HTML во время выполнения. В качестве альтернативы для представлений можно использовать многие другие системы шаблонов.
Ruby on Rails включает в себя инструменты, которые упрощают общие задачи разработки «из коробки», например, каркасы , которые могут автоматически создавать некоторые модели и представления, необходимые для базового веб-сайта . [48] Также включены WEBrick , простой веб-сервер Ruby, который распространяется вместе с Ruby, и Rake , система сборки, распространяемая как драгоценный камень . Вместе с Ruby on Rails эти инструменты обеспечивают базовую среду разработки.
Ruby on Rails чаще всего подключается к Интернету не напрямую, а через какой-либо интерфейсный веб-сервер . Дворняги обычно предпочитались [ кем? ] поверх WEBrick в первые дни, [ нужна ссылка ] , но он также может работать на Lighttpd , Apache , Cherokee , Hiawatha , Nginx (либо как модуль — например , Phusion Passenger — либо через CGI , FastCGI или mod Ruby ) и многих других другие. Начиная с 2008 года, Passenger заменил Mongrel в качестве наиболее используемого веб-сервера для Ruby on Rails. [49] Ruby также изначально поддерживается в IBM i . [50]
Ruby on Rails также примечателен тем, что широко использует библиотеки JavaScript Prototype и Script.aculo.us для написания сценариев действий Ajax . [51] Первоначально Ruby on Rails использовал облегченный протокол SOAP для веб-сервисов; позже это было заменено веб-службами RESTful . Ruby on Rails 3.0 отделяет разметку страницы (которая определяет структуру страницы) от сценариев (которые определяют функциональность или логику страницы).
Начиная с версии 2.0, Ruby on Rails предлагает HTML и XML в качестве стандартных выходных форматов. Последний представляет собой средство для веб-сервисов RESTful.
В Rails 3.1 Sass стал стандартным шаблоном CSS .
По умолчанию сервер использует Embedded Ruby в представлениях HTML с файлами, имеющими расширение html.erb. Rails поддерживает замену альтернативных языков шаблонов, таких как HAML и Mustache .
Ruby on Rails 3.0 был разработан для работы с Ruby 1.8.7, Ruby 1.9.2 и JRuby 1.5.2+; более ранние версии не поддерживаются. [52]
Ruby on Rails 3.2 — последняя серия выпусков, поддерживающих Ruby 1.8.7.
Ruby on Rails разделен на различные пакеты, а именно ActiveRecord ( система объектно-реляционного отображения для доступа к базе данных), Action Pack, Active Support и Action Mailer. До версии 2.0 Ruby on Rails также включал пакет Action Web Service, который теперь заменен Active Resource. Помимо стандартных пакетов, разработчики могут создавать плагины для расширения существующих пакетов. Раньше Rails поддерживал плагины в своей собственной среде; версия 3.2 отменяет их поддержку в пользу стандартных «драгоценных камней» Ruby. [53]
Ruby on Rails часто устанавливается с помощью RubyGems , менеджера пакетов [54] , который включен в текущие версии Ruby. Многие бесплатные Unix-подобные системы также поддерживают установку Ruby on Rails и его зависимостей через собственную систему управления пакетами .
Ruby on Rails обычно развертывается с сервером базы данных, например MySQL или PostgreSQL , и веб-сервером, например Apache, на котором работает модуль Phusion Passenger .
Ruby on Rails предназначен для того, чтобы сделать упор на соглашение, а не на конфигурацию (CoC) и принцип «Не повторяй себя» (DRY).
Доктрина Rails — это постоянный инструмент, который определяет философию, проектирование и реализацию среды Ruby on Rails.
«Соглашение важнее конфигурации» означает, что разработчику необходимо указать только нетрадиционные аспекты приложения. Например, если в модели есть класс Sale , соответствующая таблица в базе данных по умолчанию называется sales . Только если кто-то отклоняется от этого соглашения, например называет таблицу «проданной продукцией», разработчику необходимо написать код, учитывающий эти имена. Как правило, соглашения Ruby on Rails приводят к меньшему количеству кода и меньшему количеству повторений. [55]
«Не повторяйтесь» означает, что информация расположена в одном однозначном месте. Например, используя модуль ActiveRecord Rails, разработчику не нужно указывать имена столбцов базы данных в определениях классов. Вместо этого Ruby on Rails может получить эту информацию из базы данных на основе имени класса.
«Толстые модели, тонкие контроллеры» означают, что большая часть логики приложения должна быть размещена внутри модели, при этом контроллер должен быть как можно более легким.
HTML Over The Wire (Hotwire), [56] [57] Концептуальное сжатие, [58] [59] и надежная безопасность [60] характеризуют подход Rails 7.0 к структуре One person. [а]
В марте 2007 года Дэвид Хайнемайер Ханссон подал заявку на регистрацию трех товарных знаков , связанных с Ruby on Rails, в USPTO . Эти приложения касаются фразы «RUBY ON RAILS», [62] слова «RAILS», [63] и официального логотипа Rails. [64] Летом 2007 года Ханссон отказал издателю Apress в разрешении использовать логотип Ruby on Rails на обложке новой книги Ruby on Rails, написанной некоторыми авторитетными членами сообщества. Этот эпизод вызвал вежливый протест в сообществе Ruby on Rails. [65] [66] В ответ на эту критику Ханссон ответил:
Я разрешаю использование [логотипа Rails] только для продуктов, с которыми я непосредственно связан. Например, книги, в разработке которых я участвовал, или конференции, на которых я имел право голоса в их исполнении. Я определенно стремился бы обеспечить соблюдение всех товарных знаков Rails. [65]
Товарный знак логотипа аннулирован 25 октября 2019 г. [64]
Раньше Rails, работающий на Ruby Interpreter компании Matz ( фактически эталонный интерпретатор Ruby), подвергался критике за проблемы с масштабируемостью. [67] Эти критики часто упоминали различные сбои в работе Twitter в 2007 и 2008 годах, которые стимулировали частичный переход Twitter на Scala (которая работает на виртуальной машине Java ) для их системы массового обслуживания и другого промежуточного программного обеспечения . [68] [69] Аспекты пользовательского интерфейса сайта продолжали работать на Ruby on Rails [70] до 2011 года, когда он был заменен из-за опасений по поводу производительности. [71] С другой стороны, многие разработчики бизнес-приложений Rails полагались на проектирование системной архитектуры, включая выбор ядра базы данных, конфигурации кэша и серверов, для решения проблем масштабируемости. Первоначальный автор Rails Дэвид Хайнемайер Ханссон раскритиковал Twitter, заявив, что их проблемы с масштабированием были последствиями их собственных плохих архитектурных решений, а не виной Rails. По мнению Ханссона, обвинять Rails в своих проблемах, не внося при этом никакого вклада в развитие фреймворка, неблагодарно и несправедливо. [72]
В 2011 году компания Gartner Research отметила, что, несмотря на критику и сравнения с Java, многие известные потребительские веб-компании используют Ruby on Rails для создания масштабируемых веб-приложений. Некоторые из крупнейших сайтов, использующих Ruby on Rails, включают Airbnb , Cookpad , GitHub , GitLab , [73] Scribd , Shopify и Basecamp . [74] По оценкам, по состоянию на январь 2016 года более 1,2 миллиона веб-сайтов используют Ruby on Rails. [75] [76]
В марте 2012 года исследователь безопасности Егор Хомаков обнаружил уязвимость массового назначения , которая позволяла удаленно использовать некоторые приложения Rails, и продемонстрировал это, незлонамеренно взломав GitHub после того, как его предыдущие попытки ответственного раскрытия были отклонены. [77]
24 сентября 2013 г. в Ruby on Rails было обнаружено нарушение безопасности сохранения файлов cookie сеанса. В конфигурации по умолчанию весь хеш сеанса хранится в файле cookie сеанса, известном как CookieStore , что позволяет любому аутентифицированному сеансу, имеющему файл cookie сеанса, войти в систему в качестве целевого пользователя в любое время в будущем. В качестве обходного пути администраторам рекомендуется настроить сохранение файлов cookie на сервере с помощью таких механизмов, как ActiveRecordStore . [78]
Исследователи Дэниел Джексон и Джозеф Нир разработали отладчик данных, который они назвали «Space», который может анализировать доступ к данным программы Rails и определять, правильно ли программа придерживается правил, касающихся ограничений доступа. 15 апреля 2016 года компания Near сообщила, что анализ 50 популярных веб-приложений, использующих Space, выявил 23 ранее неизвестные уязвимости безопасности. [79]
Rails 3.0 был разработан для работы с Ruby 1.8.7, Ruby 1.9.2 и JRuby 1.5.2+.
По различным показателям Twitter на данный момент является крупнейшим сайтом Rails в сети.
Работа на Rails вынудила нас решать проблемы масштабирования — проблемы, с которыми в конечном итоге сталкивается любой растущий сайт — гораздо раньше, чем, я думаю, мы бы это сделали на другом фреймворке.
У нас была система очередей на основе Ruby, которую мы использовали для связи между интерфейсами Rails и демонами, и в итоге мы заменили ее системой, написанной на Scala.
Ruby на самом деле работал довольно прилично в нормальном устойчивом состоянии, но время запуска и поведение при сбое были нежелательными.
По словам Пэйна, к концу этого года Twitter надеется перенести всю свою инфраструктуру промежуточного программного обеспечения и API на новый язык.
Ruby останется, но только во внешней части.
«Мы по-прежнему довольны Rails для создания функций, ориентированных на пользователя... с точки зрения производительности он подходит для людей, просматривающих веб-страницы. Это тяжелый тип асинхронной обработки, от которого мы отошли».
Мы используем Scala для некоторых целей в Twitter, но большая часть сайта написана на Ruby.