Ruby on Rails 7.2.0がリリースされました。
Rails 7.2 has been released! Better production defaults, Dev containers, new guides design, and more! https://t.co/uLlVLd4Jsg
— Ruby on Rails (@rails) August 10, 2024
- リリース情報: Ruby on Rails — Rails 7.2: Better production defaults, Dev containers, new guides design, and more!
英語版Changelogをまとめて見るにはGItHubのリリースタグ↓が便利です。v7.2.0
タグの日付は日本時間の2024/08/10 09:04でした。
- リリースタグ: Release 7.2.0 · rails/rails
詳しくは以下のコミットリストをご覧ください。
追記(2024/08/16): Railsガイドも7.2に更新しました↓。
#Railsガイド がRails 7.2に対応!!🆙✨
🛤 Rails 7.2リリースノート
🛠 Dev Containerでの開発
🚀 本番環境のパフォーマンス改善
(最適化のトレードオフ、PumaやYJITの設定、負荷テストや測定項目の解説など)が新たに追加され、既存ガイドも大幅に改訂されました...!!📕💖https://t.co/1WexdNRvJ9 pic.twitter.com/JTiHShnj1r
— Railsガイド 📕 (@RailsGuidesJP) August 16, 2024
追記(2024/08/23): y-yagiさんによるRails 7.2新機能解説も便利です↓。
🔗 更新の概要
詳しい更新内容については、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.1のEOLは旧メンテナンスポリシーに沿って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よりだいぶ少なくなっています。
▶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は件数の多い順です。
件数の少ない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.rb
やconfig/environments/test.rb
でconfig.active_job.queue_adapter
を設定していても、選択したアダプタがすべてのテストで共通して使われるとは限らなかった。テストでは、指定したアダプタが使われることもあればTestAdapter
が使われることもあった。
Rails 7.2では、queue_adapter
コンフィグが設定されていればそれを尊重するようになった。設定が提供されていない場合はTestAdapter
が使われる
詳しくは#48585を参照。
Alex Ghiculescu
🔗 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 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でもリリース済みです。
🔗 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#deconstruct
をNokogiri::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
時刻を記録するようになった
改修前は、メッセージ種別がping
やwelcome
の場合にしかコネクションが維持されなかった。
改修後は、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_stream
やstop_stream_for
などによってストリームが停止していることのアサーションに利用できる。
既存のassert_has_stream
やassert_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: 文字列をTime
やDateTime
に型変換したときのタイムゾーンオフセットのバグを修正
- 文字列を
Time
やDateTime
に型変換するときにタイムゾーンオフセットの分(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::Attributes
をinclude
したクラスでこのメソッドが使えるようになる。振る舞いは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ウォッチタグ)