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

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

  • Action Cable
  • Rails API
  • API атрибутов Active Record
  • Test Runner
  • Эксклюзивное использование интерфейса командной строки rails вместо Rake
  • Sprockets 3
  • Turbolinks 5
  • Требуется Ruby 2.2.2+

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


1. Обновление до Rails 5.0

Если вы обновляете существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 5.0, необходимо сначала обновиться до Rails 4.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для обновления доступен в руководстве Обновление Rails.

2. Основные изменения

2.1. Action Cable

Pull Request

Action Cable — это новый фреймворк в Rails 5. Он с легкостью интегрирует WebSockets с остальными частями вашего приложения Rails.

Action Cable позволяет писать функционал реального времени на Ruby в стиле и формате остальной части приложения Rails, в то же время являясь производительным и масштабируемым. Он представляет полный стек, включая клиентский фреймворк на JavaScript и серверный фреймворк на Ruby. Вы получаете доступ к моделям, написанным с помощью Active Record или другой ORM.

Подробности смотрите в руководстве Обзор Action Cable.

Теперь можно использовать Rails для создания can now be used to create облегченных только API-приложений. Это полезно для создания и обслуживания API, подобным API Twitter или GitHub, которые можно использовать как для публичного доступа, так и для собственных приложений.

Новое api-приложение Rails можно сгенерировать с помощью:

$ rails new my_api --api

Это сделает три главные вещи:

  • Настроит ваше приложение для изначального использования с более ограниченным набором промежуточных программ. В частности, по умолчанию оно не включит любые промежуточные программы, полезные для браузерных приложений (такие как поддержка куки).
  • Унаследует ApplicationController от ActionController::API вместо ActionController::Base. Также как и с промежуточными программами, это отбросит все модули Action Controller, предоставляющие функционал, в основном используемый браузерными приложениями.
  • Настроит генераторы пропускать генерацию вьюх, хелперов и ассетов при генерации нового ресурса.

Приложение представляет основу для API, которая затем может быть настроена под нужды приложения.

Подробности смотрите в руководстве Использование Rails для API-приложений.

2.2. API атрибутов Active Record

Определяет в модели тип с атрибутом. Это позволит при необходимости переопределить тип существующих атрибутов. Это позволяет контролировать, как значения конвертируются в и из SQL при присвоении модели. Это также изменяет поведение значений, переданных в ActiveRecord::Base.where, что позволяет использовать наши объекты предметной области в большей части Active Record не полагаясь на особенности реализации или monkey patching.

Некоторые из вещей, которые можно достичь с помощью этого: - Тип, распознанный Active Record, может быть переопределен. - Также может быть представлено значение по умолчанию. - Атрибутам не обязательно должен соответствовать столбец базы данных.


# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "original default"
end

# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end

store_listing = StoreListing.new(price_in_cents: '10.1')

# before
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, :integer # настраиваемый тип
  attribute :my_string, :string, default: "new default" # значение по умаолчанию
  attribute :my_default_proc, :datetime, default: -> { Time.now } # значение по умолчанию
  attribute :field_without_db_column, :integer, array: true
end

# after
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # => {field_without_db_column: [1, 2, 3]}

Создание собственных типов:

Можно определить свои собственные типы, но они должны отвечать на методы для определенного типа значения. Метод deserialize или cast будет вызван на вашем объекте типа с необработанными данными из базы данных или от контроллера. Это полезно, к примеру, при осуществлении пользовательских преобразований, таких как данные Money.

Запросы:

При вызове ActiveRecord::Base.where, он будет использовать тип, определенный классом модели, для конвертации значения в SQL, вызвав serialize на вашем объекте типа.

Это дает объектам способность указывать, как конвертировать значения при выполнении запросов SQL.

Отслеживание изменений (Dirty Tracking):

Тип атрибута дает возможность изменить способ, как выполняется отслеживание изменений.

Подробности смотрите в его документации.

2.3. Запуск тестов

Был представлен новый запуск тестов, улучшающий возможности запуска тестов из Rails. Для использования этого запуска тестов просто напишите bin/rails test.

Test Runner вдохновлялся RSpec, minitest-reporters, maxitest и другими. Он включает некоторые из этих значимых улучшений:

  • Запуск одиночного теста с помощью номера строки теста.
  • Запуск нескольких тестов, определяя номера строк тестов.
  • Улучшенные сообщения об падениях, что также упрощает перезапуск упавших тестов.
  • Быстрое падение с помощью опции -f для немедленной остановки в случае падения, вместо ожидания полного завершения тестового набора.
  • Отложенный вывод теста, пока не закончится полный тестовый прогон, с помощью опции -d.
  • Вывод полного стека исключения с помощью опции -b.
  • Интеграция с Minitest, чтобы разрешить опции, такие как -s для указания seed, -n для запуска определенного теста по имени, -v для более выразительного вывода, и так далее.
  • Цветной тестовый вывод.

3. Railties

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

3.1. Удалено

  • Удалена поддержка debugger, используйте вместо него byebug. debugger больше не поддерживается Ruby 2.2. (коммит)

  • Удалены устаревшие задачи test:all и test:all:db. (коммит)

  • Удален устаревший Rails::Rack::LogTailer. (коммит)

  • Удалена устаревшая константа RAILS_CACHE. (коммит)

  • Удалена устаревшая настройка serve_static_assets. (коммит)

  • Удалены задачи для документации doc:app, doc:rails и doc:guides. (коммит)

  • Из стека по умолчанию удалена промежуточная программа Rack::ContentLength. (коммит)

3.2. Устарело

  • Устарела config.static_cache_control в пользу config.public_file_server.headers. (Pull Request)

  • Устарела config.serve_static_files в пользу config.public_file_server.enabled. (Pull Request)

  • Устарели задачи в пространстве имен rails в пользу пространства имен app. (например, задачи rails:update и rails:template переименованы в app:update и app:template.) (Pull Request)

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

  • Добавлен Rails test runner bin/rails test. (Pull Request)

  • Вновь сгенерированные приложения и плагины получают README.md в формате Markdown. (коммит, Pull Request)

  • Добавлена задача bin/rails restart для перезапуска вашего приложения Rails, изменяя время tmp/restart.txt. (Pull Request)

  • Добавлена задача bin/rails initializers, выводящая все определенные инициализаторы в том порядке, в котором они вызываются Rails. (Pull Request)

  • Добавлена bin/rails dev:cache для включения или отключения кэширования в режиме разработки. (Pull Request)

  • Добавлен скрипт bin/update для автоматического обновления среды development. (Pull Request)

  • Проксируются задачи Rake с помощью bin/rails. (Pull Request, Pull Request)

  • Новые приложения генерируются с включенным монитором событийной файловой системы на Linux и macOS. Эту особенность можно отключить, передав --skip-listen в генератор. (коммит, коммит)

  • Генерация приложений с опцией вывода лога в STDOUT в production с помощью переменной среды RAILS_LOG_TO_STDOUT. (Pull Request)

  • Для новых приложений включен HSTS с заголовком IncludeSudomains. (Pull Request)

  • Генератор приложения создает новый файл config/spring.rb, который сообщает Spring наблюдать за дополнительными распространенными файлами. (коммит)

  • Добавлена --skip-action-mailer, чтобы пропустить Action Mailer при генерации нового приложения. (Pull Request)

  • Убрана директория tmp/sessions и задача очистки rake, связанная с ней. (Pull Request)

  • Изменен _form.html.erb, генерируемый скаффолдом, чтобы использовались локальные переменные. (Pull Request)

  • Отключена автозагрузка классов в среде production. (commit)

4. Action Pack

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

4.1. Удалено

  • Удален ActionDispatch::Request::Utils.deep_munge. (коммит)

  • Удален ActionController::HideActions. (Pull Request)

  • Удалены методы respond_to и respond_with, этот функционал был извлечен в гем responders. (коммит)

  • Удалены устаревшие файлы тестовых утверждений. (коммит)

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

  • Удалена устаревшая опция only_path в хелперах *_path. (коммит)

  • Удален устаревший NamedRouteCollection#helpers. (коммит)

  • Удалена устаревшая поддержка определения маршрутов с помощью опции :to, не содержащей #. (коммит)

  • Удален устаревший ActionDispatch::Response#to_ary. (коммит)

  • Удален устаревший ActionDispatch::Request#deep_munge. (коммит)

  • Удален устаревший ActionDispatch::Http::Parameters#symbolized_path_parameters. (коммит)

  • Удалена устаревшая опция use_route в тестах контроллеров. (коммит)

  • Удалены assigns и assert_template. Оба метода были извлечены в гем rails-controller-testing. (Pull Request)

4.2. Устарело

  • Устарели все колбэки *_filter в пользу колбэков *_action. (Pull Request)

  • Устарели интеграционные методы тестирования *_via_redirect. Используйте вручную follow_redirect! после вызова запроса для того же поведения. (Pull Request)

  • Устарел AbstractController#skip_action_callback в пользу отдельных методов skip_callback. (Pull Request)

  • Устарела опция :nothing для метода render. (Pull Request)

  • Устарела передача первого параметра как Hash и код статуса по умолчанию для метода head. (Pull Request)

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

  • Устарел доступ к типам mime с помощью констант (т.е. Mime::HTML). Вместо них используйте оператор индексирования с символом (т.е. Mime[:html]). (Pull Request)

  • Устарел redirect_to :back в пользу redirect_back, который принимает аргумент fallback_location, устраняющий возможность RedirectBackError. (Pull Request)

  • В ActionDispatch::IntegrationTest и ActionController::TestCase устарели позиционные аргументы в пользу аргументов с ключевым словом. (Pull Request)

  • Устарели параметры пути :controller и :action. (Pull Request)

  • Устарел метод env на экземплярах контроллера. (commit)

  • Устарел и был убран из стека промежуточных программ ActionDispatch::ParamsParser. Чтобы настроить парсеры параметров, используйте ActionDispatch::Request.parameter_parsers=. (commit, commit)

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

  • Добавлен ActionController::Renderer для рендера произвольных шаблонов вне экшнов контроллера. (Pull Request)

  • Произошел переход на синтаксис с ключевыми аргументами в методах запроса HTTP ActionController::TestCase и ActionDispatch::Integration. (Pull Request)

  • В Action Controller добавлен http_cache_forever, таким образом можно кэшировать отклик, который никогда не устаревает. (Pull Request)

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

  • Для экшнов без соответствующих шаблонов рендерится head :no_content вместо вызова ошибки. (Pull Request)

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

  • Добавлена поддержка для чистых API-приложений. Добавлен ActionController::API в качестве замены ActionController::Base для такого типа приложений. (Pull Request)

  • ActionController::Parameters больше не наследуется от HashWithIndifferentAccess. (Pull Request)

  • Упрощена настройка config.force_ssl и config.ssl_options, они сделаны менее опасными для пробы и более простыми для отключения. (Pull Request)

  • Добавлена возможность возврата произвольных заголовков в ActionDispatch::Static. (Pull Request)

  • Изменено значение по умолчанию для опции prepend метода protect_from_forgery на false. (коммит)

  • ActionController::TestCase будет перемещен в отдельный гем в Rails 5.1. Вместо него используйте ActionDispatch::IntegrationTest. (коммит)

  • Rails генерирует слабые ETag по умолчанию. (Pull Request)

  • Добавлена опция для CSRF токенов для отдельной формы. (Pull Request)

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

  • Обновлены политики рендеринга по умолчанию, когда экшн контроллера не указывает явно отклик. (Pull Request)

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

  • Показанные сообщения flash убираются перед сохранением в сессию. (Pull Request)

  • Добавлена поддержка передачи коллекции записей в fresh_when и stale?. (Pull Request)

  • ActionController::Live стал ActiveSupport::Concern. Это означает, что его нельзя просто включить в другие модули без расширения их с помощью ActiveSupport::Concern, иначе ActionController::Live не возымеет эффект в production. Также можно использовать другой модуль для включения кода обработки специальных ошибок Warden/Devise, так как промежуточные программы не могут поймать :warden, брошенный в порожденном треде в случае использования ActionController::Live. (Подробнее об этой проблеме)

  • Представлены Response#strong_etag= и #weak_etag=, и аналогичные опции для fresh_when и stale?. (Pull Request)

5. Action View

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

5.1. Удалено

  • Уделен устаревший AbstractController::Base::parent_prefixes. (коммит)

  • Удален ActionView::Helpers::RecordTagHelper, этот функционал был извлечен в гем record_tag_helper. (Pull Request)

  • Убрана опция :rescue_format для хелпера translate, так как она больше не поддерживается I18n. (Pull Request)

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

  • Изменен обработчик шаблонов по умолчанию с ERB на Raw. (коммит)

  • Рендеринг коллекций может кэшировать и извлекать несколько партиалов за раз. (Pull Request, коммит)

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

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

  • Имя шаблона партиала больше не обязано быть валидным идентификатором Ruby. (коммит)

  • Хелпер datetime_tag теперь генерирует тег input с типом datetime-local. (Pull Request)

  • Разрешены блоки при рендеринге с помощью хелпера render partial:. (Pull Request)

6. Action Mailer

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

6.1. Удалено

  • Удалены устаревшие хелперы *_path во вьюхах email. (коммит)

  • Удалены устаревшие методы deliver и deliver!. (коммит)

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

  • Поиск шаблонов теперь учитывает локаль по умолчанию и фолбэки I18n. (коммит)

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

  • Добавлены assert_enqueued_emails и assert_no_enqueued_emails. (Pull Request)

  • Добавлена настройка config.action_mailer.deliver_later_queue_name для установления имени очереди рассыльщика. (Pull Request)

  • Добавлена поддержка кэширования фрагмента во вьюхах Action Mailer. Добавлена новая конфигурационная опция config.action_mailer.perform_caching для определения, должны ли ваши шаблоны осуществлять кэширование или нет. (Pull Request)

7. Active Record

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

7.1. Удалено

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

  • Удален устаревший ActiveRecord::Tasks::DatabaseTasks#load_schema. Этот метод был заменен ActiveRecord::Tasks::DatabaseTasks#load_schema_for. (коммит)

  • Удален устаревший serialized_attributes. (коммит)

  • Удалены устаревшие автоматические кэши счетчиков на has_many :through. (коммит)

  • Удален устаревший sanitize_sql_hash_for_conditions. (коммит)

  • Удален устаревший Reflection#source_macro. (коммит)

  • Удалены устаревшие symbolized_base_class и symbolized_sti_name. (коммит)

  • Удалены устаревшие ActiveRecord::Base.disable_implicit_join_references=. (коммит)

  • Удален устаревший доступ к спецификации соединения с помощью строкового метода доступа. (коммит)

  • Удалена устаревшая поддержка предварительной загрузки связей, зависимых от экземпляра. (коммит)

  • Удалена устаревшая поддержка интервалов PostgreSQL с исключенной нижней границей. (коммит)

  • Удалено предупреждение об устаревании при при изменении relation с кэшированным Arel. Вместо этого вызывается ошибка ImmutableRelation. (коммит)

  • Из ядра удален ActiveRecord::Serialization::XmlSerializer. Эта особенность была извлечена в гем activemodel-serializers-xml. (Pull Request)

  • Из ядра удалена поддержка старой версии адаптера баз данных mysql. Большинству пользователей можно использовать mysql2. Он будет конвертирован в отдельный гем, если найдется кто-то, кто будет его поддерживать. (Pull Request 1, Pull Request 2)

  • Удалена поддержка гема protected_attributes. (коммит)

  • Удалена поддержка для PostgreSQL версии ниже 9.1. (Pull Request)

  • Удалена поддержка гема activerecord-deprecated_finders. (коммит)

  • Удалена константа ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES. (commit)

7.2. Устарело

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

  • Устарел возврат false в качестве способа прервать цепочку колбэков Active Record. Рекомендуемый способ throw(:abort). (Pull Request)

  • Устарел ActiveRecord::Base.errors_in_transactional_callbacks=. (коммит)

  • Устарел Relation#uniq, вместо него используйте Relation#distinct. (коммит)

  • Устарел тип PostgreSQL :point в пользу нового, возвращающего объекты Point вместо Array (Pull Request)

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

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

  • Синхронизировано поведение #tables. (Pull Request)

  • Устарели SchemaCache#tables, SchemaCache#table_exists? и SchemaCache#clear_table_cache! в пользу их новых дубликатов data_source. (Pull Request)

  • Устарел connection.tables в адаптерах SQLite3 и MySQL. (Pull Request)

  • Устарела передача аргументов в #tables - метод #tables в некоторых адаптерах (mysql2, sqlite3) мог возвращать и таблицы, и представления, в то время как другие (postgresql) просто возвращали таблицы. Чтобы сделать их поведение согласующимся, в будущем #tables будет возвращать только таблицы. (Pull Request)

  • Устарел table_exists? - метод #table_exists? мог проверять и таблицы, и представления. Чтобы сделать его поведение согласующимся с #tables, в будущем #table_exists? будет проверять только таблицы. (Pull Request)

  • Устарела отправка аргумента offset в find_nth. Вместо этого используйте метод offset на relation. (Pull Request)

  • Устарели {insert|update|delete}_sql в DatabaseStatements. Вместо этого используйте публичные методы {insert|update|delete}. (Pull Request)

  • Устарел use_transactional_fixtures в пользу use_transactional_tests для большей ясности. (Pull Request)

  • Устарела передача столбца в ActiveRecord::Connection#quote. (commit)

  • В find_in_batches добавлена опция end, дополняющая параметр start, для определения, где следует остановить обработку пакетами. (Pull Request)

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

  • Добавлена опция foreign_key в references во время создания таблицы. (коммит)

  • Новый API атрибутов. (коммит)

  • Добавлена опция :_prefix/:_suffix в определении enum. (Pull Request, Pull Request)

  • Добавлен #cache_key в ActiveRecord::Relation. (Pull Request)

  • Изменено значение по умолчанию null для timestamps на false. (коммит)

  • Добавлен ActiveRecord::SecureToken, чтобы инкапсулировать генерацию уникальных токенов для атрибутов модели с помощью SecureRandom. (Pull Request)

  • Добавлена опция :if_exists для drop_table. (Pull Request)

  • Добавлен ActiveRecord::Base#accessed_fields, который может быть использован, чтобы быстро просмотреть, какие поля были прочитаны из модели, когда вы выбираете только те данные из базы данных, которые вам нужны. (коммит)

  • Добавлен метод #or на ActiveRecord::Relation, позволяющий использование оператора OR в сочетании с выражениями WHERE или HAVING. (коммит)

  • Добавлен ActiveRecord::Base.suppress предотвращающий получатель от сохранения в заданном блоке. (Pull Request)

  • belongs_to по умолчанию теперь вызывает ошибку валидации, если связь не существует. Это можно отключить для конкретной связи с помощью optional: true. Также устарела опция required в пользу optional для belongs_to. (Pull Request)

  • Добавлен config.active_record.dump_schemas для настройки поведения db:structure:dump. (Pull Request)

  • Добавлена опция config.active_record.warn_on_records_fetched_greater_than. (Pull Request)

  • Добавлена поддержка нативного типа данных JSON в MySQL. (Pull Request)

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

  • Добавлены методы #views и #view_exists? на адаптерах соединений. (Pull Request)

  • Добавлен ActiveRecord::Base.ignored_columns, чтобы сделать некоторые столбцы невидимыми из Active Record. (Pull Request)

  • Добавлены connection.data_sources и connection.data_source_exists?. Эти методы определяют, какие relation могут быть использованы для создание моделей Active Record (обычно таблицы и представления). (Pull Request)

  • В файлах фикстур можно указать класс модели в самом файле YAML. (Pull Request)

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

  • Добавлены ActiveRecord::Relation#left_joins и ActiveRecord::Relation#left_outer_joins. (Pull Request)

  • Добавлены колбэки after_{create,update,delete}_commit. (Pull Request)

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

  • ApplicationRecord - это новый суперкласс для всех моделей приложения, по аналогии с контроллерами приложения, являющимися подклассами ApplicationController вместо ActionController::Base. Это дает возможность приложениям иметь единое место для настройки специфичного для приложения поведения модели. (Pull Request)

  • Добавлены методы ActiveRecord #second_to_last и #third_to_last. (Pull Request)

  • Добавлена возможность аннотации объектов базы данных (таблиц, столбцов, индексов) комментариями, хранимыми в метаданных базы данных для PostgreSQL & MySQL. (Pull Request)

  • Добавлена поддержка подготовленных выражений (prepared statements) для адаптера mysql2, для mysql2 0.4.4+. Раньше это поддерживалось только устаревшим адаптером mysql. Чтобы включить, установите prepared_statements: true в config/database.yml. (Pull Request)

  • Добавлена возможность вызвать ActionRecord::Relation#update на реляционных объектах, который запустит валидации на колбэках на всех объектах в реляции. (Pull Request)

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

  • Добавлена поддержка индексов по выражениям (expression indexes) и классов оператора (operator classes) для PostgreSQL. (коммит)

  • Добавлена опция :index_errors для добавления индексов к ошибкам вложенных атрибутов. (Pull Request)

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

  • Добавлена поддержка колбэков after_commit в транзакционных тестах. (Pull Request)

  • Добавлен метод foreign_key_exists?, чтобы просмотреть, существует ли внешний ключ на таблицу. (Pull Request)

  • Добавлена опция :time для метода touch, для затрагивания моделей временем, отличным от текущего времени. (Pull Request)

  • Изменены транзакционные колбэки, чтобы не проглатывали ошибки. До этого изменения любая ошибка в транзакционном колбэке отлавливалась и выводилась в лог, кроме случая использования (сейчас устаревшей) опции raise_in_transactional_callbacks = true.

    Сейчас эти ошибки больше не отлавливаются, а просто всплывают, что соответствует поведению других колбэков. (commit)

8. Active Model

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

8.1. Удалено

  • Удалены устаревшие ActiveModel::Dirty#reset_#{attribute} и ActiveModel::Dirty#reset_changes. (Pull Request)

  • Удалена сериализация XML. Эта особенность была извлечена в гем activemodel-serializers-xml. (Pull Request)

  • Удален модуль ActionController::ModelNaming. (Pull Request)

8.2. Устарело

  • Устарел возврат false в качестве способа прервать цепочку колбэков Active Model и ActiveModel::Validations. Рекомендуемый способ throw(:abort). (Pull Request)

  • Устарели методы ActiveModel::Errors#get, ActiveModel::Errors#set и ActiveModel::Errors#[]=, имеющие противоречивое поведение. (Pull Request)

  • Устарела опция :tokenizer для validates_length_of в пользу чистого Ruby. (Pull Request)

  • Устарели ActiveModel::Errors#add_on_empty и ActiveModel::Errors#add_on_blank без замены. (Pull Request)

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

  • Добавлен ActiveModel::Errors#details для определения, какие валидаторы провалились. (Pull Request)

  • Извлечен ActiveRecord::AttributeAssignment в ActiveModel::AttributeAssignment, позволяя его использование в любом объекте в качестве включаемого модуля. (Pull Request)

  • Добавлены ActiveModel::Dirty#[attr_name]_previously_changed? и ActiveModel::Dirty#[attr_name]_previous_change для улучшения доступа в записанные изменения после того, как модель была сохранена. (Pull Request)

  • Валидация нескольких контекстов за раз в valid? и invalid?. (Pull Request)

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

9. Active Job

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

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

  • ActiveJob::Base.deserialize делегируется в класс задания. Это позволяет заданиям присоединить произвольные метаданные при сериализации и прочитать их при выполнении. (Pull Request)

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

  • Сгенерированное задание теперь по умолчанию наследуется от app/jobs/application_job.rb. (Pull Request)

  • Позволяет DelayedJob, Sidekiq, qu, que и queue_classic возвращать ActiveJob::Base id задания как provider_job_id. (Pull Request, Pull Request, коммит)

  • Реализован простой процессор AsyncJob и связанный AsyncAdapter, который складывает задания в пул тредов concurrent-ruby. (Pull Request)

  • Изменен адаптер по умолчанию со встроенного на асинхронный. Это лучше по умолчанию, так как тогда тесты не будут ошибочно проходить, полагаясь на поведение, проходящее синхронно. (коммит)

10. Active Support

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

10.1. Удалено

  • Удален устаревший ActiveSupport::JSON::Encoding::CircularReferenceError. (commit)

  • Удалены устаревшие методы ActiveSupport::JSON::Encoding.encode_big_decimal_as_string= и ActiveSupport::JSON::Encoding.encode_big_decimal_as_string. (commit)

  • Удален устаревший ActiveSupport::SafeBuffer#prepend. (commit)

  • Удалены устаревшие методы из Kernel. silence_stderr, silence_stream, capture и quietly. (commit)

  • Удален устаревший файл active_support/core_ext/big_decimal/yaml_conversions. (commit)

  • Удалены устаревшие методы ActiveSupport::Cache::Store.instrument и ActiveSupport::Cache::Store.instrument=. (commit)

  • Удален устаревший Class#superclass_delegating_accessor. Вместо него используйте Class#class_attribute. (Pull Request)

  • Удален устаревший ThreadSafe::Cache. Вместо него используйте Concurrent::Map. (Pull Request)

  • Удален Object#itself, так как он реализован в Ruby 2.2. (Pull Request)

10.2. Устарело

  • Устарел MissingSourceFile в пользу LoadError. (commit)

  • Устарел alias_method_chain в пользу Module#prepend, представленного в Ruby 2.0. (Pull Request)

  • Устарел ActiveSupport::Concurrency::Latch в пользу Concurrent::CountDownLatch из concurrent-ruby. (Pull Request)

  • Устарела опция :prefix для number_to_human_size без замены. (Pull Request)

  • Устарел Module#qualified_const_ в пользу встроенных методов Module#const_. (Pull Request)

  • Устарела передача строки для определения колбэков. (Pull Request)

  • Устарели ActiveSupport::Cache::Store#namespaced_key, ActiveSupport::Cache::MemCachedStore#escape_key и ActiveSupport::Cache::FileStore#key_file_path. Вместо них используйте normalize_key. (Pull Request, commit)

  • Устарел ActiveSupport::Cache::LocaleCache#set_cache_value в пользу write_cache_value. (Pull Request)

  • Устарела передача аргументов в assert_nothing_raised. (Pull Request)

  • Устарел Module.local_constants в пользу Module.constants(false). (Pull Request)

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

  • Добавлены методы #verified и #valid_message? в ActiveSupport::MessageVerifier. (Pull Request)

  • Изменен способ, которым прерываются цепочки колбэков. Теперь предпочтительный метод прерывания цепочки колбэков – явный throw(:abort). (Pull Request)

  • Новая конфигурационная опция config.active_support.halt_callback_chains_on_return_false для определения, могут ли колбэки ActiveRecord, ActiveModel и ActiveModel::Validations быть прерваны, возвращая false в колбэке 'before'. (Pull Request)

  • Изменена сортировка тестов по умолчанию с :sorted на :random. (commit)

  • Добавлены методы #on_weekend?, #on_weekday?, #next_weekday, #prev_weekday в Date, Time и DateTime. (Pull Request, Pull Request)

  • Добавлена опция same_time для #next_week и #prev_week в Date, Time и DateTime. (Pull Request)

  • Добавлены аналоги #prev_day и #next_day для #yesterday и #tomorrow в Date, Time и DateTime. (Pull Request)

  • Добавлен SecureRandom.base58 для генерации случайных строк base58. (commit)

  • Добавлен file_fixture в ActiveSupport::TestCase. Он представляет простой механизм для доступа к файлам с примерами в ваших тестовых случаях. (Pull Request)

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

  • Добавлены ActiveSupport::ArrayInquirer и Array#inquiry. (Pull Request)

  • Добавлен ActiveSupport::TimeZone#strptime, позволяющий парсить время, как будто из заданной временной зоны. (commit)

  • Добавлены предикатные методы Integer#positive? и Integer#negative? в духе Integer#zero?. (commit)

  • Добавлены восклицательные версии методов доступа в ActiveSupport::OrderedOptions, вызывающие KeyError, если значение .blank?. (Pull Request)

  • Добавлен Time.days_in_year, возвращающий количество дней в заданном году, или в текущем году, если не указан аргумент. (commit)

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

  • Добавлен набор методов thread_m/cattr_accessor/reader/writer для объявления переменных класса и модуля, существующих отдельно для каждого треда. (Pull Request)

  • Добавлены методы Array#second_to_last и Array#third_to_last. (Pull Request)

  • Опубликованы API ActiveSupport::Executor и ActiveSupport::Reloader, чтобы позволить компонентам и библиотекам управлять и участвовать в выполнении кода приложения и процессе перезагрузки приложения. (Pull Request)

  • Теперь ActiveSupport::Duration поддерживает форматирование и парсинг ISO8601. (Pull Request)

  • Теперь ActiveSupport::JSON.decode поддерживает парсинг локального времени ISO8601, если включен parse_json_times. (Pull Request)

  • Теперь ActiveSupport::JSON.decode возвращает объекты Date для строк с датой. (Pull Request)

  • В TaggedLogging добавлена возможность логгерам быть инициализированными несколько раз, и у них не будет общих тегов между собой. (Pull Request)

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

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