Заметки о релизе Ruby on Rails 7.1
Ключевые новинки в Rails 7.1:
Ключевые новинки в Rails 7.1:
- Генерация Dockerfile для новых приложений Rails
- Добавлен
ActiveRecord::Base.normalizes - Добавлен
ActiveRecord::Base.generates_token_for - Добавлен
perform_all_laterдля одновременной постановки в очередь нескольких заданий - Составные первичные ключи
- Представлен адаптер для
Trilogy - Добавлен
ActiveSupport::MessagePack - Представлены
config.autoload_libиconfig.autoload_lib_onceдля улучшенной автозагрузки - API Active Record для обычных асинхронных запросов
- Возможность для шаблонов устанавливать строгие
locals - Добавлен
Rails.application.deprecators - Поддержка сопоставления с образцом для JSON
response.parsed_body - Расширение
response.parsed_bodyдля парсинга HTML с помощью Nokogiri - Представлен
ActionView::TestCase.register_parser
Эти заметки о релизе покрывают только основные изменения. Чтобы узнать о других обновлениях, различных исправлениях программных ошибок и изменениях, обратитесь к логам изменений или к списку коммитов в главном репозитории Rails на GitHub.
Апгрейд до Rails 7.1
Прежде чем апгрейднуть существующее приложение, было бы хорошо иметь перед этим покрытие тестами. Также, до попытки обновиться до Rails 7.1, необходимо сначала произвести апгрейд до Rails 7.0 и убедиться, что приложение все еще выполняется так, как нужно. Список вещей, которые нужно выполнить для апгрейда доступен в руководстве Апгрейд Ruby on Rails.
Основные особенности
Генерация Dockerfile для новых приложений Rails
Поддержка Docker по умолчанию для новых приложений Rails. При генерации нового приложения, Rails теперь включит файлы для Docker в приложение.
Эти файлы служат основополагающей настройкой для развертывания вашего приложения Rails в среде production с помощью Docker. Важно отметить, что эти файлы не предназначены для целей разработки.
Вот быстрый пример того, как собрать и запустить ваше приложение Rails с помощью этих файлов Docker:
$ docker build -t app .
$ docker volume create app-storage
$ docker run --rm -it -v app-storage:/rails/storage -p 3000:3000 --env RAILS_MASTER_KEY=<your-config-master-key> appТакже из этого образа Docker можно запустить console или runner:
$ docker run --rm -it -v app-storage:/rails/storage --env RAILS_MASTER_KEY=<your-config-master-key> app consoleТе, кто ищет, как создать мультиплатформенный образ (например, развертывание на Apple Silicon для AMD или Intel), и передать его на Docker Hub, следуйте этим шагам:
$ docker login -u <your-user>
$ docker buildx create --use
$ docker buildx build --push --platform=linux/amd64,linux/arm64 -t <your-user/image-name> .Это улучшение упрощает процесс развертывания, предоставляя удобную стартовую точку для поднятия и запуска вашего приложения Rails в среде production.
Добавлен ActiveRecord::Base.normalizes
ActiveRecord::Base.normalizes объявляет нормализацию атрибутов. Нормализация применяется, когда атрибут назначается или обновляется, и нормализованное значение будет записано в базу данных. Нормализация также применяется к соответствующему аргументу с ключом в методах запроса, позволяя запрашивать записи с помощью неформализованных значений.
Например:
class User < ActiveRecord::Base
normalizes :email, with: -> email { email.strip.downcase }
normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end
user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email # => "cruise-control@example.com"
user = User.find_by(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")
user.email # => "cruise-control@example.com"
user.email_before_type_cast # => "cruise-control@example.com"
User.where(email: "\tCRUISE-CONTROL@EXAMPLE.COM ").count # => 1
User.where(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0
User.exists?(email: "\tCRUISE-CONTROL@EXAMPLE.COM ") # => true
User.exists?(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]) # => false
User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"Добавлен ActiveRecord::Base.generates_token_for
ActiveRecord::Base.generates_token_for определяет генерацию токенов для определенной цели. Сгенерированные токены могут стать просроченными, а также содержать данные записи. При использовании токена для получения записи, будут сравнены данные из токена и данные из записи. Если они не совпадут, токен будет считаться невалидным, и то же самое, если он просрочен.
Вот пример реализации одноразового токена сброса пароля:
class User < ActiveRecord::Base
has_secure_password
generates_token_for :password_reset, expires_in: 15.minutes do
# `password_salt` (определенный `has_secure_password`) возвращает соль для
# пароля. Соль изменяется при изменении пароля, таким образом, токен
# будет просрочен, если пароль изменится.
password_salt&.last(10)
end
end
user = User.first
token = user.generate_token_for(:password_reset)
User.find_by_token_for(:password_reset, token) # => user
user.update!(password: "new password")
User.find_by_token_for(:password_reset, token) # => nilДобавлен perform_all_later, чтобы поместит в очередь несколько заданий за раз
Метод perform_all_later в Active Job разработан, чтобы упростить процесс помещения в очередь нескольких заданий одновременно. Это мощное дополнение позволяет эффективно помещать задания в очередь без запуска колбэков. Это в особенности полезно, когда необходимо поместить набор заданий в очередь за раз, что уменьшает накладные расходы на несколько запросов к хранилищу данных очереди.
Вот как можно воспользоваться преимуществом perform_all_later:
# Постановка в очередь отдельных заданий
ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))
# Постановка в очередь массива заданий
user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
ActiveJob.perform_all_later(user_jobs)Пользуясь perform_all_later, можно оптимизировать процесс постановки заданий в очередь и пользоваться преимуществом улучшенной эффективности, в особенности при работе с большими наборами заданий. Стоит отметить, что в адаптерах очереди, поддерживающих новый метод enqueue_all, таких как адаптер Sidekiq, процесс постановки в очередь еще более оптимизирован с помощью push_bulk.
Предупреждаем, что этот новый метод представляет отдельное событие, enqueue_all.active_job, и не использует существующее событие enqueue.active_job. С помощью этого достигается точное отслеживание и отчетность о процессе массовой постановки в очередь.
Составные первичные ключи
Составные первичные ключи теперь поддерживаются и на уровне базы данных, и приложения. Rails способен извлечь эти ключи напрямую из схемы. Эта функция особенно полезна для отношений many-to-many и других сложных моделей данных, когда единственного столбца недостаточно для уникальной идентификации записи.
SQL, генерируемый методами запроса в Active Record (например, #reload, #update, #delete) будет содержать все части составного первичного ключа. Методы, наподобие #first и #last, будут использовать полный составной первичный ключ в выражениях ORDER BY.
Можно использовать макрос query_constraints в качестве "виртуального первичного ключа", чтобы достичь того же поведения без изменения схемы базы данных. Пример:
class TravelRoute < ActiveRecord::Base
query_constraints :origin, :destination
endСхожим образом связи принимают опцию query_constraints:. Эта опция служит в качестве составного внешнего ключа, настраивая список столбцов, используемых для доступа к связанной записи.
Example:
class TravelRouteReview < ActiveRecord::Base
belongs_to :travel_route, query_constraints: [:travel_route_origin, :travel_route_destination]
endПредставлен адаптер для Trilogy
Был представлен новый адаптер для содействия бесшовной интеграции Trilogy, клиента базы данных, совместимой с MySQL, с приложением Rails. Теперь у приложений Rails есть вариант включения функционала Trilogy, настраивая их файл config/database.yml. К примеру:
development:
adapter: trilogy
database: blog_development
pool: 5Альтернативно можно достичь интеграции с помощью переменной среды DATABASE_URL:
ENV['DATABASE_URL'] # => "trilogy://localhost/blog_development?pool=5"Add ActiveSupport::MessagePack
ActiveSupport::MessagePack это сериализатор, интегрированный с гемом msgpack. ActiveSupport::MessagePack может сериализовывать базовые типы Ruby, поддерживаемые msgpack, а также несколько дополнительных типов, таких как Time, ActiveSupport::TimeWithZone и ActiveSupport::HashWithIndifferentAccess.
По сравнению с JSON и Marshal, ActiveSupport::MessagePack может уменьшить размер полезной нагрузки и улучшить производительность.
ActiveSupport::MessagePack можно использовать в качестве сериализатора сообщения:
config.active_support.message_serializer = :message_pack
# Или отдельно:
ActiveSupport::MessageEncryptor.new(secret, serializer: :message_pack)
ActiveSupport::MessageVerifier.new(secret, serializer: :message_pack)В качестве сериализатора куки:
config.action_dispatch.cookies_serializer = :message_packИ в качестве сериализатора кэша:
config.cache_store = :file_store, "tmp/cache", { serializer: :message_pack }
# Или отдельно:
ActiveSupport::Cache.lookup_store(:file_store, "tmp/cache", serializer: :message_pack)Представлены config.autoload_lib и config.autoload_lib_once для улучшенной автоматической загрузки
Был представлен новый конфигурационный метод, config.autoload_lib(ignore:). Этот метод используется для улучшения путей автозагрузки приложений, с помощью включения директории lib, которая по умолчанию не включена. А также для новых приложений генерируется config.autoload_lib(ignore: %w(assets tasks)).
При вызове из config/application.rb, либо config/environments/*.rb, этот метод добавляет директорию lib в config.autoload_paths и config.eager_load_paths. Важно отметить, что эта особенность не доступно для engine.
Для обеспечения гибкости можно использовать ключевой аргумент ignore, чтобы указать поддиректории в директории lib, которые не должны управляться автозагрузчиками. К примеру, можно исключить директории, такие как assets, tasks и generators, передав их в качестве аргумента ignore:
config.autoload_lib(ignore: %w(assets tasks generators))Метод config.autoload_lib_once подобен config.autoload_lib, за исключением того, что он добавляет lib в config.autoload_once_paths.
За подробностями обратитесь к руководству по автоматической загрузке
Active Record API для обычных асинхронных запросов
Было представлено значительное улучшение для Active Record API, расширяющее его поддержку асинхронных запросов. Это улучшение посвящено необходимости более эффективной обработки не очень быстрых запросов, в частности фокусируясь на аггрегирующих (таких как count, sum и т.д.) и всех методах, возвращающих единственную запись, или что-то отличающееся от Relation.
Новый API включает следующие асинхронные методы:
async_countasync_sumasync_minimumasync_maximumasync_averageasync_pluckasync_pickasync_idsasync_find_by_sqlasync_count_by_sql
Вот краткий пример того, как использовать один из этих методов, async_count, чтобы подсчитать количество опубликованных сообщений асинхронным образом:
# Синхронный подсчет
published_count = Post.where(published: true).count # => 10
# Асинхронный подсчет
promise = Post.where(published: true).async_count # => #<ActiveRecord::Promise status=pending>
promise.value # => 10Эти методы позволяют запускать эти операции асинхронным образом, что может значительно улучшить эффективность определенных типов запросов к базе данных.
Разрешены шаблоны для установки строгих locals
Представлена новая особенность, позволяющая шаблонам устанавливать явные locals. Это улучшение предоставляет большее управление и ясность при передаче переменных в ваши шаблоны.
По умолчанию шаблоны принимают любые locals как ключевые аргументы. Однако, теперь можно определить, какие locals шаблон должен принимать, добавляя магический комментарий locals в начале файла шаблона.
Вот как это работает:
<%# locals: (message:) -%>
<%= message %>Также можно установить значения по умолчанию для этих локальных переменных:
<%# locals: (message: "Hello, world!") -%>
<%= message %>Необязательные ключевые аргументы могут быть расплющены:
<%# locals: (message: "Hello, world!", **attributes) -%>
<%= tag.p(message, **attributes) %>Если хотите отключить использование локальных переменных полностью, это можно сделать так:
<%# locals: () %>Action View будет обрабатывать магический комментарий locals: в любом шаблонизаторе, который поддерживает комментарии с префиксом #. Он может считывать этот комментарий с любой строки в партиале.
CAUTION: Поддерживаются только ключевые аргументы. Определение позиционных или блочных аргументов вызовет ошибку Action View во время отрисовки.
Добавлен Rails.application.deprecators
Новый метод Rails.application.deprecators возвращает коллекцию управляемых депрекаторов в вашем приложении и позволяет добавлять и получать отдельные депрекаторы:
Rails.application.deprecators[:my_gem] = ActiveSupport::Deprecation.new("2.0", "MyGem")
Rails.application.deprecators[:other_gem] = ActiveSupport::Deprecation.new("3.0", "OtherGem")Конфигурационные настройки коллекции влияют на все депрекаторы в коллекции.
Rails.application.deprecators.debug = true
Rails.application.deprecators[:my_gem].debug
# => true
Rails.application.deprecators[:other_gem].debug
# => trueЕсть сценарии, в которых нужно приглушить все сообщения об устаревании для определенного блока кода. С помощью коллекции депрекаторов возможно с легкостью заглушить все предупреждения депрекаторов в пределах блока:
Rails.application.deprecators.silence do
Rails.application.deprecators[:my_gem].warn # Нет предупреждения (заглушено)
Rails.application.deprecators[:other_gem].warn # Нет предупреждения (заглушено)
endПоддержка сопоставлений с образцом (pattern matching) для JSON response.parsed_body
Когда блоки тестов ActionDispatch::IntegrationTest вызывают response.parsed_body для откликов JSON, их полезная нагрузка будет доступна с indifferent access. Это включает интеграцию с Pattern Matching в Ruby, и встроенной поддержкой Minitest для pattern matching:
get "/posts.json"
response.content_type # => "application/json; charset=utf-8"
response.parsed_body.class # => Array
response.parsed_body # => [{"id"=>42, "title"=>"Title"},...
assert_pattern { response.parsed_body => [{ id: 42 }] }
get "/posts/42.json"
response.content_type # => "application/json; charset=utf-8"
response.parsed_body.class # => ActiveSupport::HashWithIndifferentAccess
response.parsed_body # => {"id"=>42, "title"=>"Title"}
assert_pattern { response.parsed_body => [{ title: /title/i }] }Расширен response.parsed_body, чтобы парсить HTML с помощью Nokogiri
Расширен модуль ActionDispatch::Testing, чтобы поддерживать парсинг значения HTML response.body в экземпляр Nokogiri::HTML5::Document:
get "/posts"
response.content_type # => "text/html; charset=utf-8"
response.parsed_body.class # => Nokogiri::HTML5::Document
response.parsed_body.to_html # => "<!DOCTYPE html>\n<html>\n..."Недавно добавленная поддержка Nokogiri для pattern matching, вместе со встроенной поддержкой Minitest для pattern matching представляют возможности для тестовых утверждений о структуре и содержимом отклика HTML:
get "/posts"
html = response.parsed_body # => <html>
# <head></head>
# <body>
# <main><h1>Some main content</h1></main>
# </body>
# </html>
assert_pattern { html.at("main") => { content: "Some main content" } }
assert_pattern { html.at("main") => { content: /content/ } }
assert_pattern { html.at("main") => { children: [{ name: "h1", content: /content/ }] } }Представлен ActionView::TestCase.register_parser
Расширен ActionView::TestCase для поддержки парсинга содержимого, отрендеренного партиалами вью, в известные структуры. По умолчанию определяет rendered_html для парсинга HTML в Nokogiri::XML::Node и rendered_json для парсинга JSON в ActiveSupport::HashWithIndifferentAccess:
test "renders HTML" do
article = Article.create!(title: "Hello, world")
render partial: "articles/article", locals: { article: article }
assert_pattern { rendered_html.at("main h1") => { content: "Hello, world" } }
end
test "renders JSON" do
article = Article.create!(title: "Hello, world")
render formats: :json, partial: "articles/article", locals: { article: article }
assert_pattern { rendered_json => { title: "Hello, world" } }
endЧтобы парсить отрендеренное содержимое в RSS, зарегистрируйте вызов к RSS::Parser.parse:
register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }
test "renders RSS" do
article = Article.create!(title: "Hello, world")
render formats: :rss, partial: article, locals: { article: article }
assert_equal "Hello, world", rendered_rss.items.last.title
endЧтобы парсить отрендеренное содержимое в Capybara::Simple::Node, перерегистрируйте парсер :html с помощью вызова к Capybara.string:
register_parser :html, -> rendered { Capybara.string(rendered) }
test "renders HTML" do
article = Article.create!(title: "Hello, world")
render partial: article
rendered_html.assert_css "main h1", text: "Hello, world"
endRailties
За подробностями обратитесь к Changelog.
Удалено
-
Удалена устаревшая команда
bin/rails secrets:setup. -
Удален заголовок по умолчанию
X-Download-Options, так как он использовался только Internet Explorer.
Устарело
-
Устарело использование
Rails.application.secrets. -
Устарели команды
secrets:showиsecrets:editв пользуcredentials. -
Устарел
Rails::Generators::Testing::Behaviourв пользуRails::Generators::Testing::Behavior.
Значимые изменения
-
Добавлена опция
sandbox_by_default, чтобы запускать консоль rails в режиме песочницы по умолчанию. -
Добавлен новый синтаксис для поддержки фильтрации тестов по диапазону строк.
-
Добавлена опция
DATABASE, включающая определение целевой базы данных при запуске командыrails railties:install:migrations, чтобы скопировать миграции. -
Добавлена поддержка Bun в генераторе
rails new --javascript.$ rails new my_new_app --javascript=bun -
Добавлена возможность показывать медленные тесты запускающему тесты.
Action Cable
За подробностями обратитесь к Changelog.
Удалено
Устарело
Значимые изменения
-
Добавлен тестовый вспомогательный метод
capture_broadcastsдля отлова всех сообщений, транслируемых в блоке. -
Добавлена возможность адаптеру Redis для pub/sub автоматически пересоединяться, когда соединение Redis потеряно.
-
Добавлены управляющие колбэки
before_command,after_commandиaround_commandкActionCable::Connection::Base.
Action Pack
За подробностями обратитесь к Changelog.
Удалено
-
Удалено устаревшее поведение у
Request#content_type -
Удалена устаревшая возможность присвоения одиночного значения
config.action_dispatch.trusted_proxies. -
Удалена регистрация устаревших драйверов
poltergeistиwebkit(capybara-webkit) для системного тестирования.
Устарело
-
Устарел
config.action_dispatch.return_only_request_media_type_on_content_type. -
Устарел
AbstractController::Helpers::MissingHelperError. -
Устарел
ActionDispatch::IllegalStateError. -
Устарели директивы политики разрешений
speaker,vibrateиvr. -
Устарели значения
trueиfalseдляconfig.action_dispatch.show_exceptionsв пользу:all,:rescuableили:none.
Значимые изменения
-
Добавлен метод
exclude?вActionController::Parameters. Он противоположен методуinclude?. -
Добавлен метод
ActionController::Parameters#extract_value, чтобы позволять извлечение сериализуемы значений из параметров. -
Добавлена возможность использования пользовательской логики для хранения и получения токенов CSRF.
-
Добавлены ключевые аргументы
htmlиscreenshotдля вспомогательного метода системного тестирования скриншотов.
Action View
За подробностями обратитесь к Changelog.
Удалено
-
Удалена устаревшая константа
ActionView::Path. -
Удалена устаревшая поддержка передачи переменных экземпляра как локальных в партиалы.
Устарело
Значимые изменения
-
check_box_tagиradio_button_tagтеперь принимаютcheckedкак ключевой аргумент. -
Добавлен вспомогательный метод
picture_tag, чтобы генерировать теги HTML<picture>. -
Вспомогательный метод
simple_formatтеперь принимает функционал:sanitize_options, позволяя добавление дополнительных опций для процесса обработки.simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", \{\}, \{ sanitize_options: \{ attributes: %w[target href] \} \}) # => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"
Action Mailer
За подробностями обратитесь к Changelog.
Удалено
Устарело
-
Устарел
config.action_mailer.preview_path. -
Устарела передача параметров в
assert_enqueued_email_withс помощью ключевого аргумента:args. Теперь поддерживается ключевой аргумент:params, используйте его для передачи параметров.
Значимые изменения
-
Добавлен
config.action_mailer.preview_pathsдля поддержки нескольких путей предварительного просмотра. -
Добавлен
capture_emailsв тестовые вспомогательные методы, чтобы для отлова всех писем, отправленных в блоке. -
Добавлен
deliver_enqueued_emailsкActionMailer::TestHelperдля доставки всех отложенных заданий почты.
Active Record
За подробностями обратитесь к Changelog.
Удалено
-
Удалена поддержка
ActiveRecord.legacy_connection_handling. -
Удалены устаревшие методы доступа конфигурации
ActiveRecord::Base -
Удалена поддержка
:include_replicasуconfigs_for. Вместо него используйте:include_hidden. -
Удален устаревший
config.active_record.partial_writes. -
Удален устаревший
Tasks::DatabaseTasks.schema_file_type. -
Убран флажок
--no-commentsв структурных выгрузках для PostgreSQL.
Устарело
-
Устарел аргумент
nameу#remove_connection. -
Устарел
check_pending!в пользуcheck_all_pending!. -
Устарела опция
deferrable: trueуadd_foreign_keyв пользуdeferrable: :immediate. -
Устарел
TestFixtures#fixture_pathв пользуTestFixtures#fixture_paths. -
Устарела делегация из
Baseкconnection_handler. -
Устарела
config.active_record.suppress_multiple_database_warning. -
Устарело использование
ActiveSupport::Durationв качестве интерполируемого связанного параметра в строковом шаблоне SQL. -
Устарел
all_connection_poolsиconnection_pool_listсделан более явным. -
Устарело, что
read_attribute(:id)возвращает первичный ключ, если первичный ключ не:id. -
Устарел аргумент
rewhereу#merge. -
Устарело создание псевдонимов не-атрибутов с помощью
alias_attribute.
Значимые изменения
-
Добавлен
TestFixtures#fixture_pathsдля поддержки нескольких путей фикстур. -
Добавлен
authenticate_byпри использованииhas_secure_password. -
Добавлен
update_attribute!кActiveRecord::Persistence, похожий наupdate_attribute, но вызывающийActiveRecord::RecordNotSaved, если колбэкbefore_*выкидывает:abort. -
Разрешено использование псевдонимов атрибутов в
insert_all/upsert_all. -
Добавлена опция
:includeкadd_index. -
Добавлен метод запроса
#regroup, как сокращение для.unscope(:group).group(fields). -
Добавлена поддержка автозаполняемых столбцов и произвольных первичных ключей адаптеру
SQLite3. -
Добавлены современные производительные значения по умолчанию для соединений с базой данных
SQLite3. -
Разрешено указывать выражения where с синтаксисом кортежа столбцов.
Topic.where([:title, :author_name] => [["The Alchemist", "Paulo Coelho"], ["Harry Potter", "J.K Rowling"]]) -
Автоматически генерируемые имена индексов теперь ограничены 62 байтами, что вписывается в лимиты длины имени индекса по умолчанию для MySQL, PostgreSQL и SQLite.
-
Представлен адаптер для клиента базы данных Trilogy.
-
Добавлен метод
ActiveRecord.disconnect_all!для немедленного закрытия всех соединений у всех пулов. -
Добавлены команды миграции PostgreSQL для переименования enum, добавления значения и переименования значения.
-
Добавлен псевдоним
ActiveRecord::Base#id_valueдля доступа к необработанному значению столбца id записи. -
Добавлена опция валидации для
enum.
Active Storage
За подробностями обратитесь к Changelog.
Удалено
-
Удалены устаревшие неправильные типы содержимого в конфигурациях Active Storage.
-
Удалены устаревшие методы
ActiveStorage::Current#hostиActiveStorage::Current#host=. -
Удалено устаревшие поведение при присвоении коллекции вложений. Вместо добавления к коллекции, сейчас коллекция заменяется.
-
Удалены устаревшие методы
purgeиpurge_laterиз связи с вложениями.
Устарело
Значимые изменения
-
ActiveStorage::Analyzer::AudioAnalyzerтеперь выводитsample_rateиtagsв хэше выводаmetadata. -
Добавлена опция использования предопределенных вариантов при вызове методов
previewилиrepresentationна вложении. -
Добавлена опция
preprocessedпри объявлении вариантов к предобработанным вариантам. -
Добавлена возможность уничтожать варианты Active Storage.
User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
Active Model
За подробностями обратитесь к Changelog.
Удалено
Устарело
Значимые изменения
-
Добавлена поддержка бесконечных рядов в опции
LengthValidator:in/:within.validates_length_of :first_name, in: ..30 -
Добавлена поддержка безначальных рядов в валидаторах
inclusivity/exclusivity.validates_inclusion_of :birth_date, in: -> \{ (..Date.today) \}validates_exclusion_of :birth_date, in: -> \{ (..Date.today) \} -
Добавлена поддержка для вызовов (challenges) пароля в
has_secure_password. Когда установлена, проверяет, что вызов пароля соответствует сохраненномуpassword_digest. -
Разрешает валидаторам принимать lambda без аргумента записи.
# До validates_comparison_of :birth_date, less_than_or_equal_to: ->(_record) \{ Date.today \} # После validates_comparison_of :birth_date, less_than_or_equal_to: -> \{ Date.today \}
Active Support
За подробностями обратитесь к Changelog.
Удалено
-
Удалено устаревшее переопределение
Enumerable#sum. -
Удален устаревший
ActiveSupport::PerThreadRegistry. -
Удалены устаревшие опции для передачи формата в
#to_sвArray,Range,Date,DateTime,Time,BigDecimal,FloatиInteger. -
Удалено устаревшее переопределение
ActiveSupport::TimeWithZone.name. -
Удален устаревший файл
active_support/core_ext/uri. -
Удален устаревший файл
active_support/core_ext/range/include_time_with_zone. -
Удалено неявное преобразование объектов в
StringвActiveSupport::SafeBuffer. -
Удалена устаревшая поддержка генерации несоответствующих RFC 4122 UUID при предоставлении ID пространства имен, не являющегося одной из констант, определенных в
Digest::UUID.
Устарело
-
Устарел
config.active_support.disable_to_s_conversion. -
Устарел
config.active_support.remove_deprecated_time_with_zone_name. -
Устарел
config.active_support.use_rfc4122_namespaced_uuids. -
Устарел
SafeBuffer#clone_empty. -
Устарело использование синглтона
ActiveSupport::Deprecation. -
Устарела инициализация
ActiveSupport::Cache::MemCacheStoreс помощью экземпляраDalli::Client. -
Устарели методы
Notification::Event#childrenи#parent_of?.
Значимые изменения
Active Job
За подробностями обратитесь к Changelog.
Удалено
- Удален
QueAdapter.
Устарело
Значимые изменения
-
Добавлен
perform_all_laterдля постановки в очередь нескольких задания за раз. -
Добавлена опция
--parentк генератору задания, чтобы указать родительский класс задания. -
Добавлен метод
after_discardкActiveJob::Base, чтобы запустить колбэк, перед тем, как задание будет сброшено. -
Добавлена поддержка логирования вызова добавления в очередь фонового задания.
Action Text
За подробностями обратитесь к Changelog.
Удалено
Устарело
Значимые изменения
Action Mailbox
За подробностями обратитесь к Changelog.
Удалено
Устарело
Значимые изменения
-
Добавлены адреса
X-Forwarded-Toк получателям. -
Добавлен метод
bounce_now_withкActionMailbox::Base, чтобы посылать возвращенное письмо без прохождения через очередь рассыльщика.
Ruby on Rails Guides
За подробностями обратитесь к Changelog.
Значимые изменения
Благодарности
Взгляните на полный список контрибьюторов Rails, на людей, которые потратили много часов, сделав Rails стабильнее и надёжнее. Спасибо им всем.