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

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

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

英語版Changelogをまとめて見るにはGItHubのリリースタグ↓が便利です。v8.1.2タグの日付は日本時間の2026/01/09 05:17でした。

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

🔗 参考: Minitest 6のサポート

Changelogには含まれていませんが、Rails 8.1.2には最近リリースされたMinitest 6をサポートするための修正も含まれています。

私がRails 8.1.1でrails newしたときにminitestが動かなくなったのに気づき、上のissueを知りました。8.1.2ではこの問題は修正されました。

🔗 最新のサポート期限

現在のメンテナンスポリシー↓ではRails 8.1.x8.0.xがバグ修正サポート対象、Rails 8.1.x8.0.x7.2.xがセキュリティ修正の対象となっています。

  • バグ修正:
    • Rails 8.1.x: 2026/10/10までサポート
    • Rails 8.0.x: 2026/05/07までサポート
  • セキュリティ修正:
    • Rails 8.1.x: 2027/10/10までサポート
    • Rails 8.0.x: 2026/11/07までサポート
    • Rails 7.2.x: 2026/08/10までサポート

Rails 7.1.x以下はセキュリティ修正も含めサポートが終了しました。

参考: Ruby on Rails — Maintenance policy

🔗 参考情報

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

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

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

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

🔗 更新の概要

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

🔗 Active Support

🔗 Make delegate and delegate_missing_to work in BasicObject subclasses by rafaelfranca · Pull Request #56353 · rails/rails

delegatedelegate_missing_toがBasicObjectのサブクラスで動作するよう修正。

Rafael Mendonça França
同Changelogより

🔗 Fix Inflections.instance_or_fallback to properly find :en fallback by Saidbek · Pull Request #56344 · rails/rails

:enにフォールバックするロケールを使った場合にpluralize:enにフォールバックしなくなっていたのを修正。

Said Kaldybaev

同PRより

🔗 Ensure TimeWithZone#as_json always return an UTF-8 string by byroot · Pull Request #56242 · rails/rails

ActiveSupport::TimeWithZone#as_jsonがUTF-8文字列を返さない場合があったのを修正。

従来は返される文字列がUS-ASCIIになる場合があり、一部で問題が生じる可能性があった。

修正後は常にUTF-8文字列を返すようになった。

Jean Boussier
同Changelogより

🔗 Fix TimeWithZone#xmlschema when wrapping DateTime local time by drymar · Pull Request #56216 · rails/rails

DateTimeインスタンスをローカル時間でラップした場合にTimeWithZone#xmlschemaが生成するISO-8601文字列が不正になる問題を修正。

従来は不正な時刻が返されていた。

Dmytro Rymar

同Changelogより

🔗 Implement LocalCache strategy on MemoryStore by mikeygough · Pull Request #56152 · rails/rails

ActiveSupport::Cache::MemoryStoreにLocalCache戦略を実装した。

このMemoryStoreは他のキャッシュストア(ActiveSupport::NullStoreなど)と同じインターフェイスに応答する必要がある。

Mikey Gough
同Changelogより

🔗 ActiveSupport: humanize handle international chars by jlduran · Pull Request #56077 · rails/rails

ActiveSupport::Inflector.humanizeが英語以外のアルファベット文字の大文字小文字を適切に変換できるよう修正。

ActiveSupport::Inflector.humanize("áÉÍÓÚ")  # => "Áéíóú"
ActiveSupport::Inflector.humanize("аБВГДЕ") # => "Абвгде"

Jose Luis Duran
同Changelogより

🔗 Active Record

🔗 fix cached_queries_count on ActiveRecord RuntimeRegistry by alanoliveira · Pull Request #56138 · rails/rails

ActiveRecord::RuntimeRegistrycached_queries_countが、クエリがキャッシュにヒットしたときにもカウントアップしていたのを修正。

fatkodima
同Changelogより

🔗 Fix merging relations with arel equality predicates with null relations by fatkodima · Pull Request #56482 · rails/rails

Arelで述語リレーションに.nonemergeするとエラーになる場合があったのを修正。

fatkodima
同Changelogより

🔗 Fix SQLite3 schema dump for non-autoincrement integer primary keys by khasinski · Pull Request #56534 · rails/rails

テーブルにAUTOINCREMENTなしの整数主キーを含むSQLite3ダンプをリストアした場合の問題を修正。

修正前は、テーブルをリストアしたときに誤って主キーのAUTOINCREMENTが有効になっていた。

Chris Hasiński
同Changelogより

🔗 [Backport 8-1-stable] Fix PostgreSQL schema_search_path after reconnect and reset by eglitobias · Pull Request #56535 · rails/rails

PostgreSQLのschema_search_pathreset!reconnect!の実行後に再適用されないよう修正。

これにより、database.ymlschema_search_pathがPostgreSQLのデフォルトにフォールバックせずに適切に再適用されるようになった。

Tobias Egli
同Changelogより

🔗 Fix enum validation to allow Float values by Saidbek · Pull Request #56447 · rails/rails

Rails 8.1.1のenumでFloat値を指定できなくなっていたのを修正。

enum :rating, { low: 0.0, medium: 0.5, high: 1.0 },

Rails 8.1.0でenum値のバリデーションが追加されたときに、浮動小数点が想定されていなかった。

Said Kaldybaev
同Changelogより

🔗 Ensure batched preloaded associations accounts for klass when grouping to avoid issues with STI by zzak · Pull Request #56415 · rails/rails

STIでの問題を回避するため、関連付けのバッチプリロードでグループ化時のklassが確実に識別されるよう修正。

zzak, Stjepan Hadjic
同Changelogより

🔗 Fix ActiveRecord::SoleRecordExceeded#record to return the relation by byroot · Pull Request #56287 · rails/rails

ActiveRecord::SoleRecordExceeded#recordがリレーションを返していなかったのを修正。

Rails 7.2まではリレーションを返していたが、Rails 8.0から誤ってモデルクラスを返すようになっていた。

Jean Boussier
同Changelogより

🔗 Handle asynchronous raise in all of reconnect! by byroot · Pull Request #56231 · rails/rails

PostgreSQLAdapterのTimeout.timeoutへの対応を改善した。

reconnect!メソッド内でスローされる非同期な例外の扱いを改善したことで、以下のような深い位置でのエラーを修正。

undefined method `key?' for nil:NilClass (NoMethodError)
          if !type_map.key?(oid)

Jean Boussier
同Changelogより

🔗 Emit structured events for Active Record work on v8.1 by y-yagi · Pull Request #56119 · rails/rails

Active Recordの構造化イベントがRails 8.1で発火していなかったのを修正。

Yuji Yaginuma
同Changelogより

🔗 Prevent duplicates when eager-loading models with a composite primary key by Martin-Alexander · Pull Request #56088 · rails/rails

複合主キーを持つhas_many関連付けを読み込むときのeager_loadを修正。

修正前は一部のレコードが複数回読み込まれることがあった。

Martin-Alexander
同Changelogより

🔗 Action View

🔗 [Bug] Fix input[type=file] accept attribute array value separator as , by bogdan · Pull Request #56389 · rails/rails

file_fieldにMIMEタイプのリストを以下のように配列で渡しても正常に処理されるよう修正(修正前はHTMLでaccept属性の値がスペース区切りになっていたが、これはHTMLの仕様に沿っていない)。

file_field(:article, :image, accept: ['image/png', 'image/gif', 'image/jpeg'])

修正後は以下を渡した場合と同様に正常に動作する。

file_field(:article, :image, accept: 'image/png,image/gif,image/jpeg')

Bogdan Gusiev
同Changelogより

🔗 Fix ERB strict locals parsing when comment spans multiple lines by Saidbek · Pull Request #56270 · rails/rails

strict localsアノテーションで複数行にわたる定義を処理できるよう修正。

<%# locals: (arg_1:,
             arg_2: nil,
             arg_3: []) %>

Said Kaldybaev
同Changelogより

🔗 Fix content_security_policy_nonce error in mailers when using content_security_policy_nonce_auto setting by jclusso · Pull Request #56050 · rails/rails

content_security_policy_nonce_auto設定を使うとメーラーでcontent_security_policy_nonceでエラーが発生していたのを修正。

content_security_policy_nonceヘルパーはActionController::ContentSecurityPolicyで提供されており、これはrequest.content_security_policy_nonceに依存している。メーラーにはこのモジュールもリクエストオブジェクトも存在しない。

Jarrett Lusso
同Changelogより

🔗 Action Pack

🔗 Implement exclude keys for ActionController::Live execution sharing by eileencodes · Pull Request #56393 · rails/rails

ActionController::Liveで共有される実行ステートを制御するためのconfig.action_controller.live_streaming_excluded_keysを追加。

ActionController::Liveを利用すると、コントローラのアクションは個別のスレッド内で実行されるが、ステートは親スレッドで共有される。この新しいコンフィグによって、アプリケーションで特定のステートキーを共有しないよう除外できるようになる。

これは、ストリーミングスレッドで独自のデータベースコネクションコンテキストを利用する必要があるconnected_toブロック内でストリーミングを行う場合に有用。

# config/application.rb
config.action_controller.live_streaming_excluded_keys = [:active_record_connected_to_stack]

デフォルトではすべてのキーが共有される。

Eileen M. Uchitelle
同Changelogより

🔗 Include HTTP_FORWARDED header in IpSpoofAttackError message if available by zzak · Pull Request #56256 · rails/rails

IpSpoofAttackErrorメッセージにForwardedヘッダーの内容が含まれていなかったのを修正。

この情報がないとエラーメッセージが誤解を招く可能性がある。

zzak
同Changelogより

🔗 Active Job

🔗 ActiveJob.perform_all_later should respect job_class.enqueue_after_transaction_commit by byroot · Pull Request #56264 · rails/rails

ActiveJob.perform_all_laterjob_class.enqueue_after_transaction_commitが反映されていなかったのを修正。

修正前は、enqueue_after_transaction_commit = trueを指定してもperform_all_laterですべてのジョブが即座にエンキューされていた。修正後は、この設定を行えばトランザクションがコミットされるまでジョブが適切に先延ばしされるようになり、perform_laterの振る舞いとも整合するようになった。

OuYangJinTing
同Changelogより

🔗 Fix Arguments#serialize missing custom serializers by skipkayhil · Pull Request #56093 · rails/rails

Rails 8.1でActiveJob::Baseが読み込まれていない状態だとActiveJob::Arguments.serializeを実行できなかったのを修正。

Hartley McGuire
同Changelogより

🔗 Active Storage

🔗 Memoize IAM client and set authorization to ADC for GCS Active Storage service by jmalcic · Pull Request #56012 · rails/rails

GCS(Google Cloud Storage)でURLをIAM(Identity and Access Management)で署名するときにADC(デフォルト認証情報)を利用する振る舞いを復活させた。

従来はIAMでURLに署名する際の自動認証にADCが使われていた。
ADCは現在も使われているが、認証クライアントがメモ化されているため、現在の認証情報が期限切れにならないと新しい認証情報がリクエストされない。ActiveStorage::Service::GCSService#iam_clientで認証を設定することで、他の認証方法を利用可能になった。

ActiveStorage::Blob.service.iam_client.authorization = Google::Auth::ImpersonatedServiceAccountCredentials.new(options)

この方法はActive Storageにのみ適用され、他のGoogle APIクライアントに影響しないため、Google::Apis::RequestOptions.default.authorizationよりも安全。

Justin Malčić
同Changelogより

🔗 Railties

🔗 Skip all system test files on app generation by eileencodes · Pull Request #56272 · rails/rails

Railsアプリ生成時にシステムテストのファイル生成をすべてスキップするよう修正。

Eileen M. Uchitelle
同Changelogより

🔗 Fix db:system:change to correctly update Dockerfile base packages by jcsmithf22 · Pull Request #56102 · rails/rails

db:system:changeでDockerfileのベースパッケージが適切に更新されるよう修正。

Josiah Smith
同Changelogより

🔗 Fix devcontainer volume mount when app name differs from folder name by rafaelfranca · Pull Request #56029 · rails/rails

アプリ名とフォルダ名が異なる場合にdevcontainerのボリュームマウントがフォルダ名ベースになっていたのを修正。

Rafael Mendonça França
同Changelogより

🔗 Fixed bin/rails notes command to work with CSS /**/ comments by davidrhyswhite · Pull Request #56412 · rails/rails

rails notesコマンドがCSSファイル内のコメントも適切に抽出するよう修正。

David White
同Changelogより

🔗 Fix default Dockerfile to properly copy the vendor directory · rails/rails@1bf1f40

デフォルトのDockerfileで、bundle install実行時にvendor/ディレクトリが適切に対象に含まれるよう修正。

Zhong Sheng
同Changelogより


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

関連記事

Rails 8.1.1/8.0.4/7.2.3/7.1.6/7.0.10がリリースされました

速報: Rails 8.1.0がリリースされました


CONTACT

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