Заметки о релизе 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::Base
id задания как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 стабильнее и надёжнее. Спасибо им всем.