Заметки о релизе Ruby on Rails 6.0

Ключевые новинки в Rails 6.0:

  • Action Mailbox
  • Action Text
  • Параллельное тестирование
  • Тестирование Action Cable

Эти заметки о релизе покрывают только основные изменения. Чтобы узнать о других обновлениях, различных исправлениях программных ошибок и изменениях, обратитесь к логам изменений или к списку коммитов в главном репозитории Rails на GitHub.


1. Апгрейд до Rails 6.0

Прежде чем апгрейднуть существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 6.0, необходимо сначала произвести апгрейд до Rails 5.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для апгрейда доступен в руководстве Апгрейд Ruby on Rails.

2. Основные особенности

2.1. Action Mailbox

Pull Request

Action Mailbox позволяет направлять входящие письма в подобные контроллерам почтовые ящики. Подробнее об Action Mailbox можно прочитать в руководстве Основы Action Mailbox.

2.2. Action Text

Pull Request

Action Text добавляет возможность хранения и редактирования обогащенного текста в Rails. Это включает редактор Trix, обрабатывающий все от форматирования до ссылок, цитирования, списков, вложенных изображений и галерей. Содержимое обогащенного текста, сгенерированного редактором Trix, сохраняется в собственной модели RichText, которая связывается с существующими моделями Active Record в приложении. Любые встроенные изображения (или другие вложения) автоматически сохраняются с помощью Active Storage и связываются с включающей моделью RichText.

Подробнее об Action Text можно прочитать в руководстве Обзор Action Text.

2.3. Параллельное тестирование

Pull Request

Параллельное тестирование позволяет распараллелить тестовый набор. Хотя форк процессов является методом по умолчанию, треды также поддерживаются. Запуск тестов параллельно сокращает время, затрачиваемое на запуск всего тестового набора.

2.4. Тестирование Action Cable

Pull Request

Инструменты тестирования Action Cable позволяют тестировать функционал Action Cable на любом уровне: соединения, каналы, трансляции.

3. Railties

За подробностями обратитесь к Changelog.

3.1. Удалено

  • Удален устаревший хелпер after_bundle в шаблонах плагинов. (Commit)

  • Удалена устаревшая поддержка config.ru, использующая класс приложения в качестве аргумента для run. (Commit)

  • Удален устаревший аргумент environment из команд rails. (Commit)

  • Удален устаревший метод capify! в генераторах и шаблонах. (Commit)

  • Удален устаревший config.secret_token. (Commit)

3.2. Устарело

  • Устарела передача имени сервера Rack в качестве обычного аргумента в rails server. (Pull Request)

  • Устарела поддержка использования переменной среды HOST для определения IP сервера. (Pull Request)

  • Устарел доступ к кэшам, возвращаемым config_for, по не символьным ключам. (Pull Request)

3.3. Значимые изменения

  • Добавлена явная опция --using или -u для указания сервера для команды rails server. (Pull Request)

  • Добавлена возможность увидеть вывод rails routes в расширенном формате. (Pull Request)

  • Запуск задачи заполнения базы данных с помощью встроенного адаптера Active Job. (Pull Request)

  • Добавлена команда rails db:system:change для изменения базы данных приложения. (Pull Request)

  • Добавлена команда rails test:channels для тестирования только каналов Action Cable. (Pull Request)

  • Представлена защита против атак перепривязывания DNS. (Pull Request)

  • Добавлена возможность прерваться при неудаче во время запуска команд генератора. (Pull Request)

  • Webpacker сделан компилятором JavaScript по умолчанию в Rails 6. (Pull Request)

  • Добавлена поддержка нескольких баз данных для команды rails db:migrate:status. (Pull Request)

  • Добавлена возможность использования различных путей миграции из нескольких баз данных в генераторах. (Pull Request)

  • Добавлена поддержка учетных данных для нескольких сред. (Pull Request)

  • null_store сделан хранилищем кэша по умолчанию в тестовой среде. (Pull Request)

4. Action Cable

За подробностями обратитесь к Changelog.

4.1. Удалено

  • Заменены ActionCable.startDebugging() и ActionCable.stopDebugging() с помощью ActionCable.logger.enabled. (Pull Request)

4.2. Устарело

  • Для Action Cable не было устареваний в Rails 6.0.

4.3. Значимые изменения

  • Добавлена поддержка опции channel_prefix для адаптеров подписки PostgreSQL в cable.yml. (Pull Request)

  • Разрешена передача произвольной конфигурации в ActionCable::Server::Base. (Pull Request)

  • Добавлены хуки загрузки :action_cable_connection и :action_cable_channel. (Pull Request)

  • Добавлены Channel::Base#broadcast_to и Channel::Base.broadcasting_for. (Pull Request)

  • Закрытие соединения при вызове reject_unauthorized_connection из ActionCable::Connection. (Pull Request)

  • Пакет Action Cable JavaScript преобразован из CoffeeScript в ES2015, и его исходники опубликованы в npm. (Pull Request)

  • Конфигурация адаптера WebSocket и адаптера logger перемещена из свойств ActionCable в ActionCable.adapters. (Pull Request)

  • Добавлена опция id в адаптере Redis для различения Redis-соединений Action Cable. (Pull Request)

5. Action Pack

За подробностями обратитесь к Changelog.

5.1. Удалено

  • Удален устаревший хелпер fragment_cache_key в пользу combined_fragment_cache_key. (Commit)

  • Удалены устаревшие методы в ActionDispatch::TestResponse: #success? в пользу #successful?, #missing? в пользу #not_found?, #error? в пользу #server_error?. (Commit)

5.2. Устарело

  • Устарел ActionDispatch::Http::ParameterFilter в пользу ActiveSupport::ParameterFilter. (Pull Request)

  • Устарел force_ssl на уровне контроллера в пользу config.force_ssl. (Pull Request)

5.3. Значимые изменения

  • Изменен ActionDispatch::Response#content_type. возвращающий заголовок Content-Type как есть. (Pull Request)

  • Вызывается ArgumentError, если параметр ресурса содержит двоеточие. (Pull Request)

  • Разрешено вызывать ActionDispatch::SystemTestCase.driven_by с блоком для определения специфичных возможностей браузера. (Pull Request)

  • Добавлена промежуточная программа ActionDispatch::HostAuthorization, защищающая от атак перепривязывания DNS. (Pull Request)

  • Разрешено использование parsed_body в ActionController::TestCase. (Pull Request)

  • Вызывается ArgumentError, когда существуют несколько корневых маршрутов в том же контексте без использования указаний именования as:. (Pull Request)

  • Разрешено использование #rescue_from для обработки ошибок парсинга параметра. (Pull Request)

  • Добавлен ActionController::Parameters#each_value для перебора параметров. (Pull Request)

  • Имена файлов кодируются в Content-Disposition при send_data и send_file. (Pull Request)

  • Раскрыт ActionController::Parameters#each_key. (Pull Request)

  • Добавлены метаданные назначения и прекращения внутри подписанных/зашифрованных куки для предотвращения копирования значения из одного в другое куки. (Pull Request)

  • Вызывается ActionController::RespondToMismatchError для конфликтующих вызовов respond_to. (Pull Request)

  • Добавлена явная страница ошибки когда отсутствует шаблон для формата запроса. (Pull Request)

  • Представлен ActionDispatch::DebugExceptions.register_interceptor, способ вклиниться в DebugExceptions и обработать исключение, перед тем, как оно будет отрендерено. (Pull Request)

  • Выводится только один заголовок Content-Security-Policy на запрос. (Pull Request)

  • Добавлен модуль, специальный для конфигурации Rails для заголовков по умолчанию, который может быть явно включен в контроллерах. (Pull Request)

  • Добавлен #dig в ActionDispatch::Request::Session. (Pull Request)

6. Action View

За подробностями обратитесь к Changelog.

6.1. Удалено

  • Удален устаревший хелпер image_alt. (Commit)

  • Убран пустой модуль RecordTagHelper, функционал которого уже был перенесен в гем record_tag_helper. (Commit)

6.2. Устарело

  • Устарел ActionView::Template.finalize_compiled_template_methods без замены. (Pull Request)

  • Устарел config.action_view.finalize_compiled_template_methods без замены. (Pull Request)

  • Устарел вызов приватных методов модели из хелпера вью options_from_collection_for_select. (Pull Request)

6.3. Значимые изменения

  • Кэш Action View очищается в разработке только при изменении файла, что ускоряет режим разработки. (Pull Request)

  • Все npm-пакеты Rails перемещены в пространстве имен @rails. (Pull Request)

  • Принимаются только форматы из зарегистрированных типов MIME. (Pull Request, Pull Request)

  • В вывод сервера о рендере шаблона и партиала добавлены allocations. (Pull Request)

  • В тег date_select добавлена опция year_format, позволяющая настроить имена годов. (Pull Request)

  • Для хелпера javascript_include_tag добавлена опция nonce: true для поддержки автоматической генерации nonce для Политики безопасности контента. (Pull Request)

  • Добавлена конфигурация action_view.finalize_compiled_template_methods, чтобы включить или отключить финализаторы ActionView::Template. (Pull Request)

  • Вызов JavaScript confirm извлечен в собственный переопределяемый метод в rails_ujs. (Pull Request)

  • Добавлена конфигурационная опция action_controller.default_enforce_utf8 для управления принуждением кодировки UTF-8. По умолчанию false. (Pull Request)

  • Добавлена поддержка ключей локалей I18n для тегов submit. (Pull Request)

7. Action Mailer

За подробностями обратитесь к Changelog.

7.1. Удалено

7.2. Устарело

  • Устарел ActionMailer::Base.receive в пользу Action Mailbox. (Commit)

  • Устарели DeliveryJob и Parameterized::DeliveryJob в пользу MailDeliveryJob. (Pull Request)

7.3. Значимые изменения

  • Добавлен MailDeliveryJob для отправки и обычных, и параметризованных писем. (Pull Request)

  • Позволена работа произвольных заданий доставки с тестовыми утверждениями Action Mailer. (Pull Request)

  • Позволено указание имени шаблона для multipart писем с блоками вместо просто имени экшна. (Pull Request)

  • В полезную нагрузку уведомления deliver.action_mailer добавлены perform_deliveries. (Pull Request)

  • Улучшено сообщение лога, когда perform_deliveries является false, чтобы указать, что отправка письма была пропущена. (Pull Request)

  • Позволен вызов assert_enqueued_email_with без блока. (Pull Request)

  • Выполняются задания доставки писем из очереди в блоке assert_emails. (Pull Request)

  • ActionMailer::Base позволено отменять регистрацию обсерверов и перехватчиков. (Pull Request)

8. Active Record

За подробностями обратитесь к Changelog.

8.1. Удалено

  • Убран устаревший #set_state из объекта транзакции. (Commit)

  • Убран устаревший #supports_statement_cache? из адаптеров базы данных. (Commit)

  • Убран устаревший #insert_fixtures из адаптеров базы данных. (Commit)

  • Убран устаревший ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?. (Commit)

  • Убрана поддержка передачи имени столбца в sum, когда передан блок. (Commit)

  • Убрана поддержка передачи имени столбца в count, когда передан блок. (Commit)

  • Убрана поддержка делегации отсутствующих методов в relation к Arel. (Commit)

  • Убрана поддержка делегации отсутствующих методов в relation к приватным методам класса. (Commit)

  • Убрана поддержка указания имени временной метки для #cache_key. (Commit)

  • Убран устаревший ActiveRecord::Migrator.migrations_path=. (Commit)

  • Убран устаревший expand_hash_conditions_for_aggregates. (Commit)

8.2. Устарело

  • Устарели сопоставительные сравнения с несоответствующей чувствительностью к регистру для валидатора уникальности. (Commit)

  • Устарело использование запрашивающих методов, если получающий скоуп утек. (Pull Request)

  • Устарел config.active_record.sqlite3.represent_boolean_as_integer. (Commit)

  • Устарела передача migrations_paths в connection.assume_migrated_upto_version. (Commit)

  • Устарел ActiveRecord::Result#to_hash в пользу ActiveRecord::Result#to_a. (Commit)

  • Устарели методы в DatabaseLimits: column_name_length, table_name_length, columns_per_table, indexes_per_table, columns_per_multicolumn_index, sql_query_length и joins_per_query. (Commit)

  • Устарел update_attributes/! в пользу update/!. (Commit)

8.3. Значимые изменения

  • Установлена минимальная версия гема sqlite3 1.4. (Pull Request)

  • Добавлена rails db:prepare, чтобы создать базу данных, если она не существует, и запустить ее миграции. (Pull Request)

  • Добавлен колбэк after_save_commit в качестве сокращения для after_commit :hook, on: [ :create, :update ]. (Pull Request)

  • Добавлен ActiveRecord::Relation#extract_associated для извлечения связанных записей из relation. (Pull Request)

  • Добавлен ActiveRecord::Relation#annotate для добавления комментариев SQL в запросы ActiveRecord::Relation. (Pull Request)

  • Добавлена поддержка для настройки Optimizer Hints на базах данных. (Pull Request)

  • Добавлены методы insert_all/insert_all!/upsert_all для выполнения массовых вставок. (Pull Request)

  • Добавлена rails db:seed:replant, которая очищает таблицы каждой базы данных для текущего окружения и загружает сиды. (Pull Request)

  • Добавлен метод reselect, являющийся сокращением для unscope(:select).select(fields). (Pull Request)

  • Добавлены отрицающие скоупы для всех значений enum. (Pull Request)

  • Добавлены #destroy_by и #delete_by для условных удалений. (Pull Request)

  • Добавлена возможность автоматически переключать соединения с базой данной. (Pull Request)

  • Добавлена возможность предотвращать записи в базу данных на протяжении блока. (Pull Request)

  • Добавлен API для переключения соединений для поддержки нескольких баз данных. (Pull Request)

  • Временные метки с точностью сделаны по умолчанию в миграциях. (Pull Request)

  • Поддерживается опция :size для изменения размера текста и бинарного объекта в MySQL. (Pull Request)

  • Столбцы внешнего ключа и внешнего типа устанавливаются NULL для полиморфных связей при стратегии dependent: :nullify. (Pull Request)

  • Разрешенному экземпляру ActionController::Parameters разрешается быть переданным в качестве аргумента в ActiveRecord::Relation#exists?. (Pull Request)

  • В #where добавлена поддержка бесконечных диапазонов, представленных в Ruby 2.6. (Pull Request)

  • ROW_FORMAT=DYNAMIC сделан опцией создания таблиц по умолчанию для MySQL. (Pull Request)

  • Добавлена возможность отключить скоупы, генерируемые ActiveRecord.enum. (Pull Request)

  • Неявное упорядочивание для столбца сделано настраиваемым. (Pull Request)

  • Установлена минимальная версия PostgreSQL как 9.3, отброшена поддержка для 9.1 и 9.2. (Pull Request)

  • Значения перечисления сделаны замороженными, вызывая ошибку при попытке их изменить. (Pull Request)

  • SQL ошибок ActiveRecord::StatementInvalid сделан свойством ошибки, и подстановки в SQL отдельным свойством ошибки. (Pull Request)

  • В create_table добавлена опция :if_not_exists. (Pull Request)

  • Добавлена поддержка нескольких баз данных в rails db:schema:cache:dump и rails db:schema:cache:clear. (Pull Request)

  • Добавлена поддержка хэшей и конфигов url в хэше базы данных ActiveRecord::Base.connected_to. (Pull Request)

  • Добавлена поддержка для выражений по умолчанию и индексов выражений для MySQL. (Pull Request)

  • Добавлена опция index для хелперов миграции change_table. (Pull Request)

  • Починен откат transaction для миграций. Ранее команды внутри transaction в откатываемой миграции запускались не в обратном порядке. Изменение чинит это. (Pull Request)

  • Разрешено настраивать ActiveRecord::Base.configurations= с помощью символьного хэша. (Pull Request)

  • Починен кэш счетчика, чтобы он обновлялся, только когда запись фактически сохраняется. (Pull Request)

  • Добавлена поддержка индексов выражений для адаптера SQLite. (Pull Request)

  • Подклассам разрешено переопределять колбэки автоматического сохранения для связанных записей. (Pull Request)

  • Установлена минимальная версия MySQL как 5.5.8. (Pull Request)

  • В MySQL используется кодировка по умолчанию utf8mb4. (Pull Request)

  • Добавлена возможность фильтровать чувствительные данные в #inspect (Pull Request, Pull Request)

  • Изменен ActiveRecord::Base.configurations, чтобы возвращать объект вместо хэша. (Pull Request)

  • Добавлена настройка базы данных, чтобы отключать рекомендательные блокировки. (Pull Request)

  • Обновлен метод адаптера SQLite3 alter_table, чтобы восстанавливались внешние ключи. (Pull Request)

  • Опции :to_table метода remove_foreign_key разрешено быть откатанной. (Pull Request)

  • Починено значение по умолчанию для типов времени MySQL с указанной точностью. (Pull Request)

  • Починена опция touch, чтобы вести себя в соответствии с методом Persistence#touch. (Pull Request)

  • Вызывается исключение для определений дубликата столбца в миграциях. (Pull Request)

  • Установлена минимальная версия SQLite как 3.8. (Pull Request)

  • Починено, что родительские записи не сохранялись с дубликатами дочерних записей. (Pull Request)

  • Гарантируется, что Associations::CollectionAssociation#size и Associations::CollectionAssociation#empty? используют загруженные связи, если они присутствуют. (Pull Request)

  • Добавлена поддержка предварительной загрузки полиморфных связей, когда не у всех записей имеются требуемые связи. (Commit)

  • В ActiveRecord::Relation добавлен метод touch_all. (Pull Request)

  • Добавлен предикат ActiveRecord::Base.base_class?. (Pull Request)

  • Добавлены опции пользовательского префикса/суффикса в ActiveRecord::Store.store_accessor. (Pull Request)

  • Добавлены ActiveRecord::Base.create_or_find_by/!, чтобы разобраться с SELECT/INSERT состоянием гонки в ActiveRecord::Base.find_or_create_by/! на основе ограничений уникальности в базе данных. (Pull Request)

  • Добавлен Relation#pick в качестве сокращения для pluck одиночного значения. (Pull Request)

9. Active Storage

За подробностями обратитесь к Changelog.

9.1. Удалено

9.2. Устарело

  • Устарел config.active_storage.queue в пользу config.active_storage.queues.analysis и config.active_storage.queues.purge. (Pull Request)

  • Устарел ActiveStorage::Downloading в пользу ActiveStorage::Blob#open. (Commit)

  • Устарело непосредственное использование mini_magick для генерации вариантов изображения в пользу image_processing. (Commit)

  • Устарела :combine_options в преобразователе ImageProcessing в Active Storage без замены. (Commit)

9.3. Значимые изменения

  • Добавлена поддержка для генерации вариантов изображения BMP. (Pull Request)

  • Добавлена поддержка для генерации вариантов изображения TIFF. (Pull Request)

  • Добавлена поддержка для генерации вариантов изображения прогрессивного JPEG. (Pull Request)

  • Добавлен ActiveStorage.routes_prefix для настройки генерируемых маршрутов Active Storage. (Pull Request)

  • В ActiveStorage::DiskController#show генерируется отклик 404 Not Found, когда запрашиваемый файл отсутствует на дисковом сервисе. (Pull Request)

  • Для ActiveStorage::Blob#download и ActiveStorage::Blob#open вызывается ActiveStorage::FileNotFoundError, когда запрашиваемый файл отсутствует. (Pull Request)

  • Добавлен общий класс ActiveStorage::Error, от которого наследуются исключения Active Storage. (Commit)

  • Файлы модели, предназначенные для хранения, сохраняются, когда сохраняется модель, а не немедленно. (Pull Request)

  • Существующие изображения опционально заменяются вместо добавления к ним при присвоении к коллекции вложений (как в @user.update!(images: [ … ])). Используйте config.active_storage.replace_on_assign_to_many для контроля этого поведения. (Pull Request, Pull Request)

  • Добавлена способность отражать на определенных вложениях с помощью существующего механизма отражения Active Record. (Pull Request)

  • Добавлен ActiveStorage::Blob#open, который загружает бинарный объект во временный файл на диске, и передает этот временный файл. (Commit)

  • Поддержка потоковых загрузок из Google Cloud Storage. Требуется версия 1.11+ гема google-cloud-storage. (Pull Request)

  • Использован гем image_processing для вариантов Active Storage. Это заменяет непосредственное использование mini_magick. (Pull Request)

10. Active Model

За подробностями обратитесь к Changelog.

10.1. Удалено

10.2. Устарело

10.3. Значимые изменения

  • Добавлена конфигурационная опция для настройки формата ActiveModel::Errors#full_message. (Pull Request)

  • Добавлена поддержка настройки имени атрибута для has_secure_password. (Pull Request)

  • В ActiveModel::Errors добавлен метод #slice!. (Pull Request)

  • Добавлен ActiveModel::Errors#of_kind? для проверки существования конкретной ошибки. (Pull Request)

  • Починен метод ActiveModel::Serializers::JSON#as_json для временных меток. (Pull Request)

  • Починен валидатор численности, чтобы использовать значение до приведения типов, кроме Active Record. (Pull Request)

  • Починена валидация равенства численности для BigDecimal и Float, приводя к BigDecimal обе стороны валидации. (Pull Request)

  • Починено значение года при приведении многопараметрового хэша времени. (Pull Request)

  • Ложные булевы символы на булевых атрибутах приводятся как false. (Pull Request)

  • Возвращается правильная дата при конвертировании параметров в value_from_multiparameter_assignment для ActiveModel::Type::Date. (Pull Request)

  • Берется родительская локаль, перед тем как взять пространство имен :errors при извлечении переводов ошибки. (Pull Request)

11. Active Support

За подробностями обратитесь к Changelog.

11.1. Удалено

  • Удален устаревший метод #acronym_regex из Inflections. (Commit)

  • Удален устаревший метод Module#reachable?. (Commit)

  • Удален Kernel#` без каких-либо замен. (Pull Request)

11.2. Устарело

  • Устарело использование отрицательных числовых аргументов для String#first и String#last. (Pull Request)

  • Устарел ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase в пользу String#downcase/upcase/swapcase. (Pull Request)

  • Устарели ActiveSupport::Multibyte::Unicode#normalize и ActiveSupport::Multibyte::Chars#normalize в пользу String#unicode_normalize. (Pull Request)

  • Устарел ActiveSupport::Multibyte::Chars.consumes? в пользу String#is_utf8?. (Pull Request)

  • Устарели ActiveSupport::Multibyte::Unicode#pack_graphemes(array) и ActiveSupport::Multibyte::Unicode#unpack_graphemes(string) в пользу array.flatten.pack("U*") и string.scan(/\X/).map(&:codepoints) соответственно. (Pull Request)

11.3. Значимые изменения

  • Добавлена поддержка параллельного тестирования. (Pull Request)

  • Обеспечивается, что String#strip_heredoc сохраняет замороженность строк. (Pull Request)

  • Добавлен String#truncate_bytes для обрезания строки до максимального байтового размера без разбивания многобайтовых символов или кластеров графемы. (Pull Request)

  • В метод delegate добавлена опция private, чтобы делегировать к приватным методам. Эта опция принимает значения true/false. (Pull Request)

  • Добавлена поддержка переводов с помощью I18n для ActiveSupport::Inflector#ordinal и ActiveSupport::Inflector#ordinalize. (Pull Request)

  • В Date, DateTime, Time и TimeWithZone добавлены методы before? и after?. (Pull Request)

  • Починена ошибка, когда URI.unescape мог упасть при смешанном Unicode/escaped символьном вводе. (Pull Request)

  • Починена ошибка, когда ActiveSupport::Cache мог сильно раздуть размер хранилища, когда включено сжатие. (Pull Request)

  • Хранилище кэша Redis: delete_matched больше не блокирует сервер Redis. (Pull Request)

  • Починена ошибка, когда ActiveSupport::TimeZone.all мог упасть, когда отсутствовали данные tzinfo для любой временной зоны, определенной в ActiveSupport::TimeZone::MAPPING. (Pull Request)

  • Добавлен Enumerable#index_with, позволяющий создать хэш из перечисления с помощью значения из переданного блока или аргумента по умолчанию. (Pull Request)

  • Методам Range#=== и Range#cover? разрешено работать с аргументом Range. (Pull Request)

  • Поддерживается устаревание ключа в операциях increment/decrement в RedisCacheStore. (Pull Request)

  • В события подписчика лога добавлены время cpu, время простоя и особенности аллокаций. (Pull Request)

  • В систему нотификаций Active Support добавлена поддержка объекта события. (Pull Request)

  • Добавлена поддержка для отсутствия кэширования вхождений nil, с помощью новой опции skip_nil для ActiveSupport::Cache#fetch. (Pull Request)

  • Добавлен метод Array#extract!, убирающий и возвращающий элементы, для которых блок возвращает истинное значение. (Pull Request)

  • HTML-безопасная строка остается HTML-безопасной после нарезки (slice). (Pull Request)

  • Добавлена поддержка отслеживания автозагрузки констант с помощью логирования. (Commit)

  • Определен unfreeze_time в качестве псевдонима для travel_back. (Pull Request)

  • Изменен ActiveSupport::TaggedLogging.new, чтобы возвращался экземпляр нового логгера вместо мутации полученного в качестве аргумента. (Pull Request)

  • Методы #delete_prefix, #delete_suffix и #unicode_normalize трактуются не как HTML-безопасные. (Pull Request)

  • Починена ошибка, когда #without для ActiveSupport::HashWithIndifferentAccess падал с символьными аргументам. (Pull Request)

  • Переименованы Module#parent, Module#parents и Module#parent_name в module_parent, module_parents и module_parent_name. (Pull Request)

  • Добавлен ActiveSupport::ParameterFilter. (Pull Request)

  • Починена проблема, когда продолжительность округлялась до полной секунды, когда float добавлялось к продолжительности. (Pull Request)

  • #to_options сделан псевдонимом #symbolize_keys в ActiveSupport::HashWithIndifferentAccess. (Pull Request)

  • БОльше не вызывается ошибка, если тот же самый блок включается несколько раз для Concern. (Pull Request)

  • Сохраняется порядок ключей, переданных в ActiveSupport::CacheStore#fetch_multi. (Pull Request)

  • Починен String#safe_constantize, чтобы не вызывалась LoadError для ссылок на константу в некорректном регистре. (Pull Request)

  • Добавлены Hash#deep_transform_values и Hash#deep_transform_values!. (Commit)

  • Добавлен ActiveSupport::HashWithIndifferentAccess#assoc. (Pull Request)

  • Добавлен колбэк before_reset в CurrentAttributes и симметрично определен after_reset как псевдоним resets. (Pull Request)

  • Пересмотрен ActiveSupport::Notifications.unsubscribe, чтобы корректно обрабатывать Regex или другие multiple-pattern подписчики. (Pull Request)

  • Добавлен новый механизм автозагрузки с помощью Zeitwerk. (Commit)

  • Добавлены Array#including и Enumerable#including для удобства увеличения коллекции. (Commit)

  • Переименованы Array#without и Enumerable#without в Array#excluding и Enumerable#excluding. Старые имена методов оставлены в качестве псевдонимов. (Commit)

  • Добавлена поддержка доставления locale в transliterate и parameterize. (Pull Request)

  • Починен Time#advance для работы с датами до 1001-03-07. (Pull Request)

  • Обновлен ActiveSupport::Notifications::Instrumenter#instrument. чтобы позволить не передавать блок. (Pull Request)

  • В трекере потомков используются слабые ссылки, чтобы позволить анонимным подклассам быть собранным сборщиком мусора. (Pull Request)

  • Вызов тестовых методов с помощью метода with_info_handler, чтобы позволить работать плагинам minitest-hooks. (Commit)

  • Сохраняется статус html_safe? на ActiveSupport::SafeBuffer#*. (Pull Request)

12. Active Job

За подробностями обратитесь к Changelog.

12.1. Удалено

  • удалена поддержка гема Qu. (Pull Request)

12.2. Устарело

12.3. Значимые изменения

  • Добавлена поддержка пользовательских сериализаторов для аргументов Active Job. (Pull Request)

  • Добавлена поддержка для запуска Active Jobs во временной зоне, в которой они были поставлены в очередь. (Pull Request)

  • Разрешена передача нескольких исключений в retry_on/discard_on. (Commit)

  • Разрешен вызов assert_enqueued_with и assert_enqueued_email_with без блока. (Pull Request)

  • Уведомления для enqueue и enqueue_at обернуты в колбэк around_enqueue вместо колбэка after_enqueue. (Pull Request)

  • Разрешен вызов perform_enqueued_jobs без блока. (Pull Request)

  • Разрешен вызов assert_performed_with без блока. (Pull Request)

  • Добавлена опция :queue к хелперам и утверждениям задач. (Pull Request)

  • Добавлены хуки вокруг попыток и отмен Active Job. (Pull Request)

  • Добавлен способ тестирования для набора аргументов при выполнении задач. (Pull Request)

  • В задания, возвращаемых тестовыми хелперами Active Job, включаются десериализованные аргументы. (Pull Request)

  • Хелперам утверждений Active Job разрешается принимать Proc для ключевого слова only. (Pull Request)

  • В хелперах утверждений отбрасываются микросекунды и наносекунды из аргументов задачи. (Pull Request)

13. Руководства Ruby on Rails

За подробностями обратитесь к Changelog.

13.1. Значимые изменения

  • Добавлено руководство по нескольким базам данных с Active Record. (Pull Request)

  • Добавлен раздел о разрешении проблем автозагрузки констант. (Commit)

  • Добавлено руководство по основам Action Mailbox. (Pull Request)

  • Добавлено обзорное руководство по Action Text. (Pull Request)

14. Благодарности

Взгляните на полный список контрибьюторов Rails, на людей, которые потратили много часов, сделав Rails стабильнее и надёжнее. Спасибо им всем.