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

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

Ruby on Rails 8.0.2がリリースされました。内容はバグ修正です。

英語版Changelogをまとめて見るにはGItHubのリリースタグ↓が便利です。v9.0.2タグの日付は日本時間の2025/03/12 12:06でした。

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

🔗 参考情報

フレームワークそのもののdiffではなく、生成されるアプリのdiffをチェックするには、railsdiff.orgが便利です↓。

Railsバージョン間のgemの互換性をチェックするには、以下のrailsbump.orgが便利です。Gemfile.lockを貼り付けてチェックすることも可能です。

なお、現在のメンテナンスポリシー↓ではRails 8.0.xと7.2.xがバグ修正とセキュリティ修正のサポート対象となっています。7.1.xと7.0.xはセキュリティ修正のみのサポート、7.0.xは今年2025年4月1日にセキュリティサポート終了予定です。

参考: Ruby on Rails — Maintenance policy

7.0.xより前のバージョンは現在サポート対象外です。

🔗 更新の概要

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

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

本記事では、GitHubリリースタグに掲載されているChangelogに対応するプルリクやコミットへのリンクを取り急ぎ貼りました。

🔗 Action Pack

with_routingテストヘルパーがミドルウェアスタックをリビルドしないよう改善。さもないと一部のミドルウェア設定が失われる可能性がある。

Édouard Chin
同Changelogより

#resource#resourcesに無効な:onlyオプションや:exceptオプションを渡すと生成されるArgumentErrorでリソース名を表示するよう改善。

これによって、特にgemによってレンダリングされたルーティングの問題の発生元を突き止めやすくなる。

修正前:

:only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]

修正後

Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]

Jeremy Green
同Changelogより

ユーザーがハッシュでないパラメータを渡した場合に:path_paramsでクラッシュしないようurl_forを修正。

セキュリティスキャナによって例外が発生するのを防ぐ。

Martin Emde
同Changelogより

ActionDispatch::Executorが他のエラー報告ミドルウェアと同様に例外をアンラップするよう修正。

Jean Boussier
同Changelogより

🔗 Action View

collection_checkboxestype="hidden"<input>を生成する場合にhtml_options[:form]を尊重するよう修正。

Riccardo Odone
同Changelogより

renderに渡されたlocalsにレイアウトファイルからアクセスできるよう修正。

これによって、#31680(Rails 5.1のバグの再発)が修正される。

Mike Dalessio
同Changelogより

テンプレート内の引数エラーのうち、strict(厳密な)localsに関連するものはActionView::StrictLocalsErrorをraiseし、その他の引数エラーはそのまま再度raiseされるようになった。

従来は、テンプレートのレンダリング中にraiseしたArgumentErrorはstrict localsエラーの処理中に飲み込まれてしまっていたため、strict localsに関連しないArgumentError(誤った引数で呼び出されたヘルパーメソッドなど)が無関係なバックトレースを持つ同様のArgumentErrorに置き換えられてしまい、テンプレートのデバッグが困難になっていた。

修正後は、strict localsに関連しないArgumentErrorが再度raiseされるようになり、開発者向けに元のバックトレースが保持されるようになった。

また、ActionView::StrictLocalsErrorArgumentErrorのサブクラスであるため、ArgumentErrorをrescueする既存のコードは引き続き機能する。

修正: #52227

Mike Dalessio
同Changelogより

依存関係トラッカーが循環依存を処理するときにスタックオーバーフローになるのを修正。

Jean Boussier
同Changelogより

🔗 Active Record

マイグレーションのrename_enum_value:from:toを指定してロールバックできない問題を修正。

fatkodima
同Changelogより

無効なレコードが永続化されるのを防止。

Edouard Chin
同Changelogより

マイグレーションのdrop_tableにオプションなしでブロックを渡した場合にロールバックできなかった問題を修正。

fatkodima
同Changelogより

修飾名を渡した.group.countに続けてリレーションを.reloadすると.countできない問題を修正。

Ryuta Kamizono
同Changelogより

読み込まれたリレーションでsumに修飾名を渡すとエラーになる問題を修正。

Chris Gunther
同Changelogより

SQLite3アダプタが有限でないNumeric値を"Infinity"や"NaN"のように引用符で囲むよう修正。

Mike Dalessio
同Changelogより

libpqがdbバージョンを0で返したらPostgreSQLAdapterでコネクション失敗として処理するよう修正。

修正前は、このバージョンがキャッシュされ、コネクション構成中にアダプタの必要最小バージョンと比較するときにエラーが発生した。つまり、その後の再接続試行でコネクションが正常に構成されなくなる。

修正後は、libpqと結果が一致するコネクション失敗として扱われてActiveRecord::ConnectionFailedをraiseし、かつバージョンをキャッシュしないようになったので、次のコネクション試行でバージョンを取得できるようになった。

Joshua Young, Rian McGuire
同Changelogより

コネクション構成中のエラー処理を修正。

Active Recordのコネクション構成中にエラーが適切に処理されていなかった。
これにより中途半端な構成のコネクションが使われ、さまざまな例外が発生する可能性があった。最も一般的な例外は、PostgreSQLAdapterのundefined method 'key?' for nilTypeError: wrong argument type nil (expected PG::TypeMap)

Jean Boussier
同Changelogより

リトライ不可のクエリがリトライ可能とマーキングされていたケースを修正。

Hartley McGuire
同Changelogより

関連付けの自動保存時のバリデーションで循環参照がクラッシュしないよう修正。

zzak
同Changelogより

PoolConfigがコネクションクラスへの参照を維持しないようになった。

このクラスへの参照が保持されていると、development環境でリロードしたときに微妙な問題が発生していた。#54343を修正。

Mike Dalessio
同Changelogより

非同期クエリでSQLのActive Support Instrumentation通知が送信されない場合があったのを修正。

Post.async_count
ActiveSupport::Notifications.subscribed(->(*) { "Will never reach here" }) do
  Post.count
end

適切な競合状態のもとで、ごくまれに非同期クエリ実行後にActive Supportの通知がディスパッチされなくなることがあった。この問題は修正された。

Edouard Chin
同Changelogより

PostgreSQLのenum型でカンマを含む名前もサポートするよう修正。

Arthur Hess
同Changelogより

MySQL環境における自動増分値取得処理で複数の自動生成カラムを持つテーブルに対応。

Nikita Vasilevsky
同Changelogより

スコープ付き関連付けで文字列とバインドパラメータを使うjoinsを修正。

class Instructor < ActiveRecord::Base
  has_many :instructor_roles, -> { active }
end

class InstructorRole < ActiveRecord::Base
  scope :active, -> {
    joins("JOIN students ON instructor_roles.student_id = students.id")
    .where(students { status: 1 })
  }
end

Instructor.joins(:instructor_roles).first

上の例では、activeスコープのバインドパラメータが失われるため、ActiveRecord::StatementInvalidが発生する。

Jean Boussier
同Changelogより

システムテストでトランザクショナルなフィクスチャを使う場合の潜在的な競合状態を修正。

Sjoerd Lagarde
同Changelogより

関連付けの自動保存で、関連付けられるレコードが変更されていない場合にバリデーションを行わないよう修正。

トランザクション内で作成も変更もされていない関連レコードに対してActive Recordがバリデーションを誤って実行していた。

Post.create!(author: User.find(1)) # Fail if user is invalid

Jean Boussier
同Changelogより

🔗 Maintain connection verification for 2 seconds after use by matthewd · Pull Request #53672 · rails/rails

1件のリクエスト中にバリデーションが繰り返し再実行されるを避けるため、直近のバリデーションをデータベースコネクションで記憶するようになった(デフォルトでは2秒間)。

これにより、リクエストの期間中はコネクションがリースされてバリデーションが1回だけ行われるようになり、Rails 7.1と同様のバリデーション頻度に戻った。

Matthew Draper
同Changelogより

🔗 Active Storage

関連付けられた添付ファイルをBlobが自動保存しないようになった。

これにより、「添付ファイルを持つレコードのダーティ属性がリセットされ、そのレコードのafter_commitコールバックが期待どおりに動作しない」問題が修正される。

なお、これはアプリケーションの変更を必要としない内部的な修正であり、Active Storageの添付ファイルは引き続き(別のリレーションを介して)自動保存される。

Edouard-chin
同Changelogより

🔗 Active Support

new_framework_defaults_8_0.rbto_time_preserves_timezone設定方法を修正。

fatkodima
同Changelogより

ローカルストアが有効な場合のActive Support Cache fetch_multiを修正。

fetch_multiは、ローカルストアに記録された存在しないエントリに対して、提供されたブロックを適切にyieldするようになった。

Jean Boussier
同Changelogより

Exceptionも含めてすべての例外を報告するよう実行ラッピングを修正。

SystemStackErrorNoMemoryErrorなどのより深刻なエラーが発生した場合、エラー通知でこれらの種類の例外を報告可能にする必要がある。

Gannon McGibbon
同Changelogより

RedisCacheStoreMemCacheStoreがコネクションプール関連のエラーも処理できるよう修正。

これらのエラーはrescueされてRails.errorに報告される。

Jean Boussier
同Changelogより

ローカルキャッシュを使う場合にバージョンの有効期限が反映されるようActiveSupport::Cache#read_multiを修正。

zzak
同Changelogより

ActiveSupport::MessageVerifierActiveSupport::MessageEncryptoron_rotationコールバックの設定方法を修正。

verifier.rotate(old_secret).on_rotation { ... }

この修正によって、APIドキュメントに記載されている通りに動作する。

Jean Boussier
同Changelogより

ActiveSupport::MessageVerifierでURL安全なペイロードとURL安全でないペイロードを常に両方とも検証できるよう修正。

これは、以前生成されたすべて署名済みメッセージを直ちに無効にすることなく、どちらの設定からもシームレスに移行可能にするための修正である。

Jean Boussier, Florent Beaurain, Ali Sepehri
同Changelogより

:race_condition_ttlオプションを指定した場合にも指定の有効期限が反映されるようcache.fetchを修正。

cache.fetch("key", expires_in: 1.hour, race_condition_ttl: 5.second) do
  "something"
end

上の例では、最終的なキャッシュエントリのTTLは、指定した1時間ではなく10秒になっていた。

Dhia
同Changelogより

set_callbackにprocを&:引数で渡すとエラーになっていたのを修正。

Radamés Roriz
同Changelogより

String#mb_charsがレシーバを改変しないよう修正。

修正前は、レシーバでforce_encodingを直接呼び出していたが、修正後は最初にレシーバを複製するようになった。

Jean Boussier
同Changelogより

ErrorSubscriberがエラーの原因(rror.cause)をreportedとマーキングするよう改善。

従来、エラーをActionView::Template::Errorでラップする方法が原因で(特にビューで)エラーが2回報告されるケースが、この修正によって回避されるようになった。

Jean Boussier
同Changelogより

モジュールに名前を付けた後にModule#module_parent_nameが正しい名前を返すよう修正。

後で定数に割り当てる形でモジュールを命名すると、無名モジュールでModule#module_parent_nameを呼び出したときの戻り値が変更されていなかった。

mod = Module.new
mod.module_parent_name # => "Object"
MyModule::Something = mod
mod.module_parent_name # => "MyModule"

Jean Boussier
同Changelogより

🔗 Railties

Railsコンソールでルーティングを読み込むよう修正。

そうしないとappオブジェクトで*_pathメソッドや*urlメソッドを見つけられない。

Édouard Chin
同Changelogより

rails new --minimalオプションを更新。

--minimalフラグを拡張して、最近追加された以下の機能を除外した。

  • skip_brakeman
  • skip_ci
  • skip_docker
  • skip_kamal
  • skip_rubocop
  • skip_solid
  • skip_thruster.

eelcoj
同Changelogより

ローカル環境に存在する場合は、ENVやcredentialにあるsecret_key_baseを使うよう修正。

development環境やtest環境でENV["SECRET_KEY_BASE"]Rails.application.credentials.secret_key_baseが設定されている場合は、tmp/local_secret.txtファイルを生成する代わりにそれらをRails.config.secret_key_baseで使うようになった。

Petrik de Heus
同Changelogより

🔗 Changelogに更新の記載がない機能

以下はChangelogには更新の記載がありません。


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

関連記事

【速報】Rails 8.0.0がリリースされました


CONTACT

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