Ключевые новинки в Rails 5.0:
rails
вместо Rake
Эти заметки о релизе покрывают только основные изменения. Чтобы узнать о других обновлениях, различных исправлениях программных ошибок и изменениях, обратитесь к логам изменений или к списку коммитов в главном репозитории Rails на GitHub.
Прежде чем апгрейднуть существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 5.0, необходимо сначала произвести апгрейд до Rails 4.2 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для апгрейда доступен в руководстве Апгрейд Ruby on Rails.
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-приложений.
Определяет в модели тип с атрибутом. Это позволит при необходимости переопределить тип существующих атрибутов. Это позволяет контролировать, как значения конвертируются в и из 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
.
-s
для указания seed, -n
для запуска определенного теста по имени, -v
для более выразительного вывода, и так далее.
За подробностями обратитесь к 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 с заголовком IncludeSubdomains. (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)
За подробностями обратитесь к 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)
За подробностями обратитесь к 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)
За подробностями обратитесь к 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)
За подробностями обратитесь к 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)
За подробностями обратитесь к 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)
За подробностями обратитесь к 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)
Изменен адаптер по умолчанию со встроенного на асинхронный. Это лучше по умолчанию, так как тогда тесты не будут ошибочно проходить, полагаясь на поведение, проходящее синхронно. (коммит)
За подробностями обратитесь к 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 стабильнее и надёжнее. Спасибо им всем.