Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.2.0がリリースされました

Ruby on Rails 7.2.0がリリースされました。

英語版Changelogをまとめて見るにはGItHubのリリースタグ↓が便利です。v7.2.0タグの日付は日本時間の2024/08/10 09:04でした。

詳しくは以下のコミットリストをご覧ください。


追記(2024/08/16): Railsガイドも7.2に更新しました↓。


追記(2024/08/23): y-yagiさんによるRails 7.2新機能解説も便利です↓。

参考: Rails 7.2 - Slidev


Rails 7.2 - Slidevより

🔗 更新の概要

詳しい更新内容については、RailsガイドのRails 7.2リリースノートを参照してください↓。

参考: Ruby on Rails 7.2 リリースノート - Railsガイド

アップグレード方法については以下の手順をどうぞ。

参考: § 1.3 アップグレード手順 -- Rails アップグレードガイド - Railsガイド

Rails 7.2は、全般に従来よりもbreaking changesが少なく、その代わり7.1からの非推奨機能削除がかなり多数行われています(特にActive Record)。

🔗 メンテナンスポリシーの更新

比較的重要な変更点として、Railsのメンテナンスポリシーが以下のように更新されたことが挙げられます。

  • バージョニングから「セキュリティ問題」と「重大なセキュリティ問題」の区別が削除された
  • 個別のバージョンのEOLの表示は、Railsのメンテナンスポリシーガイドから公式サイトのMaintenance policyページに移動した

以下のガイド訳注も参考にどうぞ。

訳注:2024年8月に更新された本メンテナンスポリシーは、それ以降のリリースにのみ適用されます。したがってRails 6.1EOL旧メンテナンスポリシーに沿って2024年10月1日、Rails 7.0は2025年4月1日、Rails 7.1は2025年10月1日のままとなります。(» 原文を見る)
Ruby on Rails のメンテナンスポリシー - Railsガイドより

🔗 Ruby最小バージョンの更新

また、Rails 7.2ではRubyの最小バージョンがRuby 3.1.0に設定されました↓。

参考: 3.1.1 Rubyをインストールする -- Rails をはじめよう - Railsガイド

🔗 new_framework_defaults_7_2.rb

また、以下のnew_framework_defaults_7_2.rbに含まれる項目も、Rails 7.1のnew_framework_defaults_7_1.rbよりだいぶ少なくなっています。

参考: rails/railties/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_2.rb.tt at 7-2-stable · rails/rails

▶new_framework_defaults_7_2.rb(クリックで展開)

見やすさのため、設定項目のみコメントを解除しています(実際は全行がコメントアウトされています)。

# Be sure to restart your server when you modify this file.
#
# This file eases your Rails 7.2 framework defaults upgrade.
#
# Uncomment each configuration one by one to switch to the new default.
# Once your application is ready to run with all new defaults, you can remove
# this file and set the `config.load_defaults` to `7.2`.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html

###
# Controls whether Active Job's `#perform_later` and similar methods automatically defer
# the job queuing to after the current Active Record transaction is committed.
#
# Example:
#   Topic.transaction do
#     topic = Topic.create(...)
#     NewTopicNotificationJob.perform_later(topic)
#   end
#
# In this example, if the configuration is set to `:never`, the job will
# be enqueued immediately, even though the `Topic` hasn't been committed yet.
# Because of this, if the job is picked up almost immediately, or if the
# transaction doesn't succeed for some reason, the job will fail to find this
# topic in the database.
#
# If `enqueue_after_transaction_commit` is set to `:default`, the queue adapter
# will define the behaviour.
#
# Note: Active Job backends can disable this feature. This is generally done by
# backends that use the same database as Active Record as a queue, hence they
# don't need this feature.
#++
Rails.application.config.active_job.enqueue_after_transaction_commit = :default

###
# Adds image/webp to the list of content types Active Storage considers as an image
# Prevents automatic conversion to a fallback PNG, and assumes clients support WebP, as they support gif, jpeg, and png.
# This is possible due to broad browser support for WebP, but older browsers and email clients may still not support
# WebP. Requires imagemagick/libvips built with WebP support.
#++
Rails.application.config.active_storage.web_image_content_types = %w[image/png image/jpeg image/gif image/webp]

###
# Enable validation of migration timestamps. When set, an ActiveRecord::InvalidMigrationTimestampError
# will be raised if the timestamp prefix for a migration is more than a day ahead of the timestamp
# associated with the current time. This is done to prevent forward-dating of migration files, which can
# impact migration generation and other migration commands.
#
# Applications with existing timestamped migrations that do not adhere to the
# expected format can disable validation by setting this config to `false`.
#++
Rails.application.config.active_record.validate_migration_timestamps = true

###
# Controls whether the PostgresqlAdapter should decode dates automatically with manual queries.
#
# Example:
#   ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '2024-01-01'::date") #=> Date
#
# This query used to return a `String`.
#++
Rails.application.config.active_record.postgresql_adapter_decode_dates = true

###
# Enables YJIT as of Ruby 3.3, to bring sizeable performance improvements. If you are
# deploying to a memory constrained environment you may want to set this to `false`.
#++
Rails.application.config.yjit = true


他に気づいた点としては、Active Modelの更新が少ないのも目につきました。それだけActive Modelが安定してきたということなのかもしれません。

🔗 主なChangelog

以下のChangelogは件数の多い順です。

Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き)

Rails 7.2.0 Railties CHANGELOG(全項目リンク付き)

Rails 7.2.0 Active Support CHANGELOG(全項目リンク付き)

Rails 7.2.0 Action Pack CHANGELOG(全項目リンク付き)

Rails 7.2.0 Active Storage CHANGELOG(全項目リンク付き)

Rails 7.2.0 Action View CHANGELOG(全項目リンク付き)


件数の少ないChangelogは以下にまとめました。

🔗 Active Job

rails/activejob/CHANGELOG.md at 7-2-stable · rails/rails -- Rails 7.2.0

更新8件(うち非推奨削除3件)

🔗 Active Job: Correctly use the desired test adapter in tests by ghiculescu · Pull Request #48585 · rails/rails

参考: 週刊Railsウォッチ20240529: active_job.queue_adapterの設定がすべてのテストに反映されるよう修正

  • すべてのテストにactive_job.queue_adapterコンフィグが反映されるようになった

修正前は、config/application.rbconfig/environments/test.rbconfig.active_job.queue_adapterを設定していても、選択したアダプタがすべてのテストで共通して使われるとは限らなかった。テストでは、指定したアダプタが使われることもあればTestAdapterが使われることもあった。

Rails 7.2では、queue_adapterコンフィグが設定されていればそれを尊重するようになった。設定が提供されていない場合はTestAdapterが使われる

詳しくは#48585を参照。

Alex Ghiculescu

Rails: SidekiqからSolid Queueに移行したときの方法と注意点(翻訳)

🔗 Automatically delay Active Job enqueues to after commit by casperisfine · Pull Request #51426 · rails/rails

参考: 週刊Railsウォッチ20240416: ジョブのエンキューをトランザクション完了時まで自動先延ばしするようになった

  • Active JobがActive Recordと併用される場合にトランザクション対応するようになった

Active Jobでよくあるミスのひとつ: ジョブをトランザクション内からエンキューしてしまい、そのジョブが拾われて別のプロセスで実行された時点でトランザクションがまだコミットしていないと、さまざまなエラーが発生する。

Topic.transaction do
  topic = Topic.create(...)
  NewTopicNotificationJob.perform_later(topic)
end

Active Jobの改修によって、トランザクションがコミットした後になるまでジョブのエンキューを自動的に先延ばしするようになった。トランザクションがロールバックした場合はジョブを削除する。

この振る舞いは、さまざまなキュー実装で選択的に無効化できる。ユーザーはこの振る舞いを無効にすることも、ジョブごとに強制することも可能。

class NewTopicNotificationJob < ApplicationJob
  self.enqueue_after_transaction_commit = :never # または`:always`か`:default`
end

Jean Boussier, Cristian Bica

🔗 [Fix #50713] Do not trigger loading of ActiveJob::Base in ActiveJob::TestHelper by maximerety · Pull Request #50715 · rails/rails

注: この修正はRails 7.1.3でリリース済みです。

  • ActiveJob::TestHelper読み込み時にActiveJob::Baseが即時読み込みされないよう修正

Maxime Réty

🔗 [Fix #50230] Preserve serialized timezone when deserializing with ActiveJob::Serializers::TimeWithZoneSerializer by joshuay03 · Pull Request #50240 · rails/rails

参考: 週刊Railsウォッチ20231222: ActiveJob::Serializers::TimeWithZoneSerializerでタイムゾーンが消えていたのを修正

注: この修正はRails 7.1.3でリリース済みです。

  • ActiveSupport::TimeWithZoneの引数をデシリアライズするときに、シリアライズされたタイムゾーンが失われないよう修正

Joshua Young

🔗 (削除)Clarify that the default retry strategy uses polynomial backoff instead of exponential backoff by victormours · Pull Request #49292 · rails/rails

参考: 週刊Railsウォッチ20131004: Active Jobのリトライオプションにwait: :polynomially_longerを追加し、wait: :exponentially_longerを非推奨化

注: この修正はRails 7.1.0でリリース済みです。

  • retry_on:waitオプションで非推奨化されていた:exponentially_longer値を削除

Rafael Mendonça França

🔗 (削除)Set, serialize, and deserialize Active Job scheduled_at as Time; deserialize enqueued_at as Time; deprecate setting scheduled_at= with numeric/epoch by bensheldon · Pull Request #48066 · rails/rails

参考: 週刊Railsウォッチ20231011: Active Jobのscheduled_atの値をTimeとしてシリアライズ/デシリアライズするようになった

注: この修正はRails 7.1.0でリリース済みです。

  • scheduled_at属性に数値を設定できる非推奨化サポートを削除

Rafael Mendonça França

🔗 Remove deprecations part 1 by rafaelfranca · Pull Request #50144 · rails/rails

  • Rails.application.config.active_job.use_big_decimal_serializeを非推奨化

Rafael Mendonça França

  • BigDecimal引数でのプリミティブなシリアライザを削除

Rafael Mendonça França

関連: Fix BigDecimal(de)serialization for JSON adapters by sambostock · Pull Request #45618 · rails/rails

🔗 Action Text

rails/actiontext/CHANGELOG.md at 7-2-stable · rails/rails -- Rails 7.2.0

更新9件

🔗 Only sanitize content attribute when present in attachments by p8 · Pull Request #52093 · rails/rails

  • content属性のサニタイズはcontent属性が添付ファイルに存在する場合にのみ行うよう最適化

Petrik de Heus

🔗 Sanitize ActionText HTML ContentAttachment in Trix edit view · rails/rails@1ac6d40

  • Trixの編集ビューで、Action TextのContentAttachmentのHTMLをサニタイズするよう修正[CVE-2024-32464]

Aaron Patterson, Zack Deveau

このセキュリティ修正は、既に7.1.3.4でもリリース済みです。

Railsセキュリティ修正7.1.3.4、7.0.8.4、6.1.7.8がリリースされました

🔗 Use includes instead of eager_load for with_all_rich_text by p8 · Pull Request #50769 · rails/rails

  • with_all_rich_textメソッドでeager_loadではなくincludesを呼び出すよう修正

Petrik de Heus

🔗 Delegate ActionText::Content#deconstruct to Nokogiri by seanpdoyle · Pull Request #50473 · rails/rails

  • ActionText::Content#deconstructNokogiri::XML::DocumentFragment#elementsに委譲するようになった
content = ActionText::Content.new <<~HTML
  <h1>Hello, world</h1>

  <div>The body</div>
HTML

content => [h1, div]

assert_pattern { h1 => { content: "Hello, world" } }
assert_pattern { div => { content: "The body" } }

Sean Doyle

注: この改修によりnokogiri v1.16.0のパターンマッチングが使えるようになりました。

🔗 Take AR affixes into account for Action Text database models by chaadow · Pull Request #50299 · rails/rails

参考: 週刊Railsウォッチ20240117: Action MailboxとAction Textでもモデルのテーブル名にActive Recordのプレフィックス/サフィックス設定が効くよう修正

  • モデルに関連するAction TextデータベースにActiveRecord::Base.table_name_prefixが反映されるよう修正

Chedli Bourguiba

🔗 Fix using actiontext.js in sprocket by mgrunberg · Pull Request #49952 · rails/rails

参考: 週刊Railsウォッチ20231122: Action TextのJavaScriptがSprocketsでうまく動かない問題を修正

注: この修正はRails 7.1.2でリリース済みです。

  • ブラウザでactiontext.esm.jsとして直接利用される可能性のあるESM(ESモジュール)パッケージをコンパイルするよう修正。

Matias Grunberg

  • actiontext.jsをSprocketsで利用する場合の問題を修正。

Matias Grunberg

🔗 Fix using trix in sprockets by skipkayhil · Pull Request #49778 · rails/rails

参考: 週刊Railsウォッチ20231114: アップデートされたTrixがSprocketsでうまく動かない問題を修正

  • Trixを2.0.7にアップグレード

Hartley McGuire

  • TrixがSprocketsでうまく動かない問題を修正

Hartley McGuire

🔗 Action Cable

rails/actioncable/CHANGELOG.md at 7-2-stable · rails/rails -- Rails 7.2.0

更新3件

🔗 Improve ActionCable's TestCookieJar interface by justinko · Pull Request #51930 · rails/rails

  • ActionCable::Connection::TestCookieJarがcookie値に関してActionDispatch::Cookies::CookieJarと整合するよう修正

修正前:

cookies[:foo] = { value: "bar" }
puts cookies[:foo] # => { value: "bar" }

修正後:

cookies[:foo] = { value: "bar" }
puts cookies[:foo] # => "bar"

Justin Ko

🔗 Record ping on every actioncable message by nvasilevski · Pull Request #51503 · rails/rails

  • Action Cableのすべてのメッセージでping時刻を記録するようになった

改修前は、メッセージ種別がpingwelcomeの場合にしかコネクションが維持されなかった。
改修後は、Action Cableのどのメッセージでも pingedAt値が更新されるようになり、コネクションがstale(陳腐化)とマーキングされなくなった。

yauhenininjia

🔗 Add assertions for stopped ActionCable streams by SebastianPoell · Pull Request #50585 · rails/rails

  • Action Cableテストケース用のアサーションメソッドを2つ追加
    • assert_has_no_stream
    • assert_has_no_stream_for

これらのメソッドは、 stop_streamstop_stream_forなどによってストリームが停止していることのアサーションに利用できる。
既存のassert_has_streamassert_has_stream_forアサーションメソッドを補完する。

assert_has_no_stream "messages"
assert_has_no_stream_for User.find(42)

Sebastian Pöll, Junichi Sato

🔗 Active Model

rails/activemodel/CHANGELOG.md at 7-2-stable · rails/rails -- Rails 7.2.0

更新2件

🔗 TZ offset minute has to be negated in the Western Hemisphere by amatsuda · Pull Request #46872 · rails/rails

参考: 週刊Railsウォッチ20240306: 文字列をTimeDateTimeに型変換したときのタイムゾーンオフセットのバグを修正

  • 文字列をTimeDateTimeに型変換するときにタイムゾーンオフセットの分(minute)の値がマイナスだと正しく計算されないバグを修正

Akira Matsuda

🔗 Port type_for_attribute to Active Model by jonathanhefner · Pull Request #49910 · rails/rails

参考: 週刊Railsウォッチ20231122: Active Recordのtype_for_attributeをActive Modelに移動

  • Active Recordのtype_for_attributeメソッドをActive Modelに移動した。ActiveModel::Attributesincludeしたクラスでこのメソッドが使えるようになる。振る舞いはActive Recordのときと同じ。
class MyModel
  include ActiveModel::Attributes

  attribute :my_attribute, :integer
end

MyModel.type_for_attribute(:my_attribute) # => #<ActiveModel::Type::Integer ...>

Jonathan Hefner

🔗 Action Mailer

rails/actionmailer/CHANGELOG.md at 7-2-stable · rails/rails -- Rails 7.2.0

更新2件(うち非推奨削除2件)

🔗 (削除)Deprecate params via :args for assert_enqueued_email_with by jonathanhefner · Pull Request #48194 · rails/rails

参考: 週刊Railsウォッチ20230613: assert_enqueued_email_with:args引数へのHash渡しが非推奨化

  • assert_enqueued_email_with:argsへの非推奨化パラメータを削除

Rafael Mendonça França

🔗 (削除)Support multiple preview paths for mailers by fatkodima · Pull Request #31595 · rails/rails

参考: 週刊Railsウォッチ20220829: メーラーのプレビューパスを複数指定可能になる

  • 非推奨化されたconfig.action_mailer.preview_pathを削除

Rafael Mendonça França

注: 今後は複数形のpreview_pathsのみとなります。

🔗 Action Mailbox

rails/actionmailbox/CHANGELOG.md at 7-2-stable · rails/rails -- Rails 7.2.0

更新1件

🔗 Take AR affixes into account for Action Mailbox database models by chaadow · Pull Request #50300 · rails/rails

参考: 週刊Railsウォッチ20240117: Action MailboxとAction Textでもモデルのテーブル名にActive Recordのプレフィックス/サフィックス設定が効くよう修正

  • モデルに関連するAction MailboxデータベースにActiveRecord::Base.table_name_prefixコンフィグが反映されるよう修正

Chedli Bourguiba


TechRachoではRubyやRailsの最新情報などの記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

関連記事

Rails 7.1.0 がリリースされました


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。