Заметки о релизе 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.
Обновление до Rails 5.0
Если вы обновляете существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 5.0, необходимо сначала обновиться до Rails 4.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для обновления доступен в руководстве Обновление Rails.
Основные изменения
Action Cable
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-приложений.
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):
Тип атрибута дает возможность изменить способ, как выполняется отслеживание изменений.
Подробности смотрите в его документации.
Запуск тестов
Был представлен новый запуск тестов, улучшающий возможности запуска тестов из Rails.
Для использования этого запуска тестов просто напишите bin/rails test.
Test Runner вдохновлялся RSpec, minitest-reporters, maxitest и другими. Он включает некоторые из этих значимых улучшений:
- Запуск одиночного теста с помощью номера строчки теста.
- Запуск нескольких тестов, определяя номера строчек тестов.
- Улучшенные сообщения об падениях, что также упрощает перезапуск упавших тестов.
- Быстрое падение с помощью опции
-fдля немедленной остановки в случае падения, вместо ожидания полного завершения тестового набора. - Отложенный вывод теста, пока не закончится полный тестовый прогон, с помощью опции
-d. - Вывод полного стека исключения с помощью опции
-b. - Интеграция с
Minitest, чтобы разрешить опции, такие как-sдля указания seed,-nдля запуска определенного теста по имени,-vдля более выразительного вывода, и так далее. - Цветной тестовый вывод.
Railties
За подробностями обратитесь к Changelog.
Удалено
Удалена поддержка 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. (коммит)
Устарело
Устарела
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)
Значимые изменения
Добавлен 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)
Action Pack
За подробностями обратитесь к Changelog.
Удалено
Удален
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)
Устарело
Устарели все колбэки
*_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)
Значимые изменения
Добавлен
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)
Action View
За подробностями обратитесь к Changelog.
Удалено
Уделен устаревший
AbstractController::Base::parent_prefixes. (коммит)Удален
ActionView::Helpers::RecordTagHelper, этот функционал был извлечен в гем record_tag_helper. (Pull Request)Убрана опция
:rescue_formatдля хелпераtranslate, так как она больше не поддерживается I18n. (Pull Request)
Значимые изменения
Изменен обработчик шаблонов по умолчанию с
ERBнаRaw. (коммит)Рендеринг коллекций может кэшировать и извлекать несколько партиалов за раз. (Pull Request, коммит)
Добавлено универсальное сопоставление для явных зависимостей. (Pull Request)
disable_withсделано поведением по умолчанию для тегов submit. Отключает кнопку при отправке, чтобы предотвратить двойную отправку. (Pull Request)Имя шаблона партиала больше не обязано быть валидным идентификатором Ruby. (коммит)
Хелпер
datetime_tagтеперь генерирует тег input с типомdatetime-local. (Pull Request)Разрешены блоки при рендеринге с помощью хелпера
render partial:. (Pull Request)
Action Mailer
За подробностями обратитесь к Changelog.
Удалено
Удалены устаревшие хелперы
*_pathво вьюхах email. (коммит)Удалены устаревшие методы
deliverиdeliver!. (коммит)
Значимые изменения
Поиск шаблонов теперь учитывает локаль по умолчанию и фолбэки 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)
Active Record
За подробностями обратитесь к Changelog.
Удалено
Удалено устаревшее поведение, позволяющее передавать вложенные массивы в качестве значений запроса. (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)
Устарело
Устарела передача класса в качестве значения запроса. Вместо этого нужно передавать строки. (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)
Значимые изменения
Добавлена опция
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)
Active Model
За подробностями обратитесь к Changelog.
Удалено
Удалены устаревшие
ActiveModel::Dirty#reset_#{attribute}иActiveModel::Dirty#reset_changes. (Pull Request)Удалена сериализация XML. Эта особенность была извлечена в гем activemodel-serializers-xml. (Pull Request)
Удален модуль
ActionController::ModelNaming. (Pull Request)
Устарело
Устарел возврат
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)
Значимые изменения
Добавлен
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)
Active Job
За подробностями обратитесь к Changelog.
Значимые изменения
ActiveJob::Base.deserializeделегируется в класс задания. Это позволяет заданиям присоединить произвольные метаданные при сериализации и прочитать их при выполнении. (Pull Request)Добавлена возможность настроить адаптер очереди для каждого задания без взаимного влияния друг на друга. (Pull Request)
Сгенерированное задание теперь по умолчанию наследуется от
app/jobs/application_job.rb. (Pull Request)Позволяет
DelayedJob,Sidekiq,qu,queиqueue_classicвозвращатьActiveJob::Baseid задания какprovider_job_id. (Pull Request, Pull Request, коммит)Реализован простой процессор
AsyncJobи связанныйAsyncAdapter, который складывает задания в пул тредовconcurrent-ruby. (Pull Request)Изменен адаптер по умолчанию со встроенного на асинхронный. Это лучше по умолчанию, так как тогда тесты не будут ошибочно проходить, полагаясь на поведение, проходящее синхронно. (коммит)
Active Support
За подробностями обратитесь к Changelog.
Удалено
Удален устаревший
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)
Устарело
Устарел
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)
Значимые изменения
Добавлены методы
#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)
Благодарности
Взгляните на полный список контрибьюторов Rails, на людей, которые потратили много часов, сделав Rails стабильнее и надёжнее. Спасибо им всем.