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

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

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

英語版Changelogをまとめて見るにはGItHubのリリースタグ↓が便利です。

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

🔗 更新の概要

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

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

本記事では、GitHubリリースタグに掲載されているChangelogに対応するプルリクやコミットへのリンクを取り急ぎ貼りました。以下は更新のあった機能だけを取り上げています。また、同一機能内で同じプルリクに属するChangelog項目はまとめています。

なお、Changelogには記載されていませんが、APIドキュメントやガイドの更新も行われています。

🔗 Active Support

🔗 PR: Fix RedisCacheStore#write_multi with :expires_in by fatkodima · Pull Request #49974 · rails/rails

RedisCacheStore#write_multi:expires_inオプションが効かない問題を修正。

fatkodima
同CHANGELOGより

修正: #49973

この:expires_inオプションはキーワード引数として切り出されていたが使われていなかった。

同PRより

参考: Rails API write_multi -- ActiveSupport::Cache::Store

🔗 Fix decoding data encoded using a non-String purpose by intrip · Pull Request #49669 · rails/rails

Messageシリアライザで非文字列"purpose"フィールドのデシリアライズの不具合を修正。

Jacopo Beschi
同CHANGELOGより

非文字列の"purpose"フィールドとuse_message_serializer_for_metadata == falseでエンコードされたデータが誤ってデコードされ、デコード中に"mismatched purpose"エラーが発生していた。
両側をStringとして比較するようにすることでこの問題を修正。
同PRより

🔗 [Fix #49796] Prevent global cache options being overwritten by HolyWalley · Pull Request #49800 · rails/rails

ActiveSupport::Cache::Store#fetchブロック内で動的オプションを設定した場合に、グローバルキャッシュオプションが上書きされないよう修正。

Yasha Krasnou
同CHANGELOGより

🔗 Fix deprecation warnings for secrets:edit/show by stevegeek · Pull Request #49792 · rails/rails

requireがなかったためにbin/rails secrets:showbin/rails secrets:editを実行するとNoMethodErrorエラーになる問題を修正。

Stephen Ierodiaconou
同CHANGELOGより

🔗 Ensure {down,up}case_first returns non-frozen string by jonathanhefner · Pull Request #49837 · rails/rails

downcase_firstupcase_firstは、空文字""の場合にfrozenの文字列を返していた。

# 修正前
"foo".downcase_first.frozen? # => false
"".downcase_first.frozen?    # => true
# 修正後
"foo".downcase_first.frozen? # => false
"".downcase_first.frozen?    # => false

同PRより

🔗 Handle negative numbers in NumberToHumanSizeConverter by Earlopain · Pull Request #49791 · rails/rails

#to_fs(:human_size)が負の値でも正常に動作するよう修正。

Earlopain
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: number_to_human_sizeで負数を扱えるよう修正

🔗 Add BroadcastLogger#deep_dup by andrewn617 · Pull Request #49720 · rails/rails

要点: BroadcastLogger#dupがロガーのbroadcastsを複製できなかったため、deep_dupを追加。

参考: 週刊Railsウォッチ20231107: BroadcastLogger#deep_dupを追加

🔗 Fix issue where bootstrap.rb overwrites the level of a BroadcastLogger's broadcasts by andrewn617 · Pull Request #49721 · rails/rails

BroadcastLoggerbroadcastslevelbootstrap.rbが上書きしていたのを修正。

Andrew Novoselac
同CHANGELOGより

🔗 Handle outdated Marshal payloads in Cache::Entry with 6.1 cache_format by casperisfine · Pull Request #49716 · rails/rails

ActiveSupport::CacheがRails 6.1フォーマットの古いMarshalペイロードを処理できるよう修正。

Active SupportのCacheは、Marshalのデシリアライズできなくなったペイロードをキャッシュミスとして扱うことを想定していた。Rails 6.1のレガシーフォーマットでは圧縮ペイロードでこれが失敗していた。

Jean Boussier
同CHANGELOGより

🔗 Fix OrderedOptions#dig for array indexes by fatkodima · Pull Request #49718 · rails/rails

#44644で追加されたOrderedOptions#digでは、最初のキーだけシンボルに変換する必要がある。

修正: #49713
同PRより

🔗 Fix time travel helpers to work when nested using with separate classes by fatkodima · Pull Request #49711 · rails/rails

別のクラスでネストされていてもtravel_toタイムトラベルヘルパーが動作するよう修正。

fatkodima
同CHANGELOGより

参考: Rails API travel_to -- ActiveSupport::Testing::TimeHelpers

🔗 Fix file cache store delete_matched to work on keys longer than allowed filename size by fatkodima · Pull Request #49694 · rails/rails

修正: #49690

ファイルキャッシュストアでは、ファイルシステムパスの/などの区切り文字クラッシュしないようURLエンコードされたキーを使っている。得られたキーがファイルシステム最大ファイル名長さを超える場合は部分に分割するが、この分割は境界上で行われるべきであるにもかかわらず、誤ってエンコードシーケンス内で行われることがあった。

例: キーfoo%20bar['foo%2', '0bar']と分割されるのは誤り。分割は['foo', '%20bar']または['foo%20', 'bar']となるべき。

これに続いてdelete_matchedメソッドを利用すると、ファイルシステムディレクトリをトラバースしてディレクトリ名のデコードを試みるが、その前に行われた分割の場所が誤っている場合はエラーになる。
同PRより

🔗 ActiveSupport::LogSubscriber restore compatibility with SemanticLogger by casperisfine · Pull Request #49621 · rails/rails

semantic_logger gemとの互換性を修正。

semantic_logger gemの振る舞いはstdlibロガーと完全に同じではない。stdlibのLogger#levelがIntegerを返すのに対し、SemanticLogger#levelはSymbolを返す。

このため、SemanticLoggerインスタンスを代入するとRailsでさまざまなLogSubscriberクラスが壊れた。

Jean Boussierojab
同CHANGELOGより

reidmorrison/semantic_logger - GitHub

🔗 Active Model

🔗 Make ==(other) method of AttributeSet safe #49670 by DmitryPogrebnoy · Pull Request #49677 · rails/rails

==(other)メソッドにAttributeSetのインスタンスを渡してもエラーにならないよう修正。

Dmitry Pogrebnoy
同CHANGELOGより

🔗 Active Record

🔗 Fix renaming primary key index when renaming a PostgreSQL table having uuid primary key by fatkodima · Pull Request #49998 · rails/rails

PostgreSQLでUUID主キーを持つテーブルをリネームするときに主キーインデックスがリネームされなかった問題を修正。

fatkodima
同CHANGELOGより

🔗 [Fix #48535]: fix behavior of proc_for_binds in Arel::Nodes::HomogenousIn by JohnAnon9771 · Pull Request #49050 · rails/rails

fieldがシリアライズド属性の場合(例: fieldActiveRecord::Base.serializeが使われている、fieldがJSONカラムである)のwhere(field: values)クエリの振る舞いを修正。

João Alves
同CHANGELOGより

動機/背景

このプルリクは、issue #48535#48072を修正する。

プルリク#41068が導入されたことで、意図しない振る舞いが表面化し、キャスト済みの属性に対してproc_for_bindsがキャストを適用する原因となった。その結果、上のissueで指摘されているようにクエリが誤動作するようになった。

このコミットでは、型をActiveModel::Type.default_valueに置き換えて、2回目のシリアライズで事実上何も行わないようにすることで問題を修正する。この修正によって、「#41068以後の決定論的クエリの修正(詳しくは37361bf -- リンク切れ)」などの変更は不要になった(そうした変更では、元々HomogeneousIn内にあるproc_for_bindsを対象としていたテストが誤って InWithAdditionalValues内のproc_for_bindsをテストするようになっていた。これによって、HomogeneousIn内のproc_for_bindsに対して調整を行うたびに偽陽性が発生していた)。

修正: #48072#48535
同PRより

🔗 Prevent marking broken connections as verified by composerinteralia · Pull Request #49811 · rails/rails

壊れたコネクションが誤って"verified"とマーキングされないよう修正。

Daniel Colson
同CHANGELOGより

🔗 Don't mark Float::INFINITY as changed if didn't by MaicolBen · Pull Request #49904 · rails/rails

Float::INFINITYの同じ値を再代入したときに"changed"とマーキングされないよう修正。

浮動小数点の無限大値を持つレコードを保存したときに"changed"とマーキングすべきではない。

Maicol Bentancor
同CHANGELOGより

🔗 return nil for ActiveRecord::Base.table_name by a5-stable · Pull Request #49911 · rails/rails

ActiveRecord::Base.table_nameが"undefined method abstract_class? for Object:Class"エラーを発生していたのを、nilを返すよう修正。

a5-stable
同CHANGELOGより

🔗 Fix upserting for custom :on_duplicate and :unique_by consisting of all inserts keys by fatkodima · Pull Request #49870 · rails/rails

修正: #49867

従来は、@on_duplicate = :skip if @on_duplicate == :update && updatable_columns.empty?を実行すると、「カスタムの:on_duplicateを渡したこと」「@on_duplicateconfigure_on_duplicate_update_logicで定義済みであること」が誤って無視されていた。そのため、このロジックをこのメソッドに移動した。
同PRより

🔗 Do not rely on dup in forgetting_assignment optimization by jonathanhefner · Pull Request #49832 · rails/rails

レコードを保存すると属性が誤ってdupされる可能性がある問題(#49809)を修正。

Jonathan Hefner
同CHANGELOGより

🔗 Dump schema only for a specific db for rollback/up/down tasks for multiple dbs by fatkodima · Pull Request #49793 · rails/rails

マルチDBのrollback/up/downタスクで、指定以外のDBスキーマがダンプされないよう修正。

fatkodima
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: マルチDBのrollback/up/downで指定していないDBスキーマをダンプしないよう修正

🔗 Fix (2) case in money.rb by arBmind · Pull Request #49779 · rails/rails

PostgreSQLのmoney型の値でカンマ,が小数点として使われていて、かつ通貨記号が冒頭にない場合(例: "3,50"をキャストする場合)にNoMethodErrorが発生する問題を修正。

Andreas Reischuck and Jonathan Hefner
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: PostgreSQLのmoney型へのキャストが特定の値でエラーになる問題を修正

🔗 Support non-column-backed attributes for enum by jonathanhefner · Pull Request #49769 · rails/rails

カラムのない属性でのenumの利用を再度有効にした。
従来のようにカラムのない属性を宣言するときは、以下のように明示的に型を指定しなければならない。

class Post < ActiveRecord::Base
  attribute :topic, :string
  enum topic: %i[science tech engineering math]
end

Jonathan Hefner
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: enumでカラムのない属性のサポートが復活

🔗 Raise on foreign_key: being passed as an array in associations by nvasilevski · Pull Request #49625 · rails/rails

foreign_key:オプションに関連付けとして配列を渡すと例外を発生するよう修正。

Nikita Vasilevsky
同CHANGELOGより

参考: 週刊Railsウォッチ20231024: foreign_key:オプションに誤って配列を渡すと例外を発生するよう変更

🔗 Return back maximum allowed PostgreSQL table name to 63 characters by fatkodima · Pull Request #49592 · rails/rails

PostgreSQLで許される最大テーブル名長さを63文字に戻した。

fatkodima
同CHANGELOGより

修正: #49567

従来、強制する最大テーブル名長さが63文字から63 - "_pkey".sizeに変更されていたのを63文字に戻し、テーブル名のりネーム時に主キー名やシーケンス名(PostgreSQLがテーブル作成時に生成する名前)を手動で構築するようにした。

テストは#45136でカバー済みなので新しいテストは足していない。

cc: @rafaelfranca
同PRより

関連: 週刊Railsウォッチ20220620: テーブル名の長さに上限を設定

🔗 Fix detecting IDENTITY columns for PostgreSQL < 10 by fatkodima · Pull Request #49598 · rails/rails

バージョン10より前のPostgreSQLでIDENTITYカラムが検出されていたのを修正。

fatkodima
同CHANGELOGより

🔗 Action View

🔗 Handle negative numbers in NumberToHumanSizeConverter by Earlopain · Pull Request #49791 · rails/rails

number_to_human_sizeビューヘルパーが負数を正しく扱えるよう修正。

Earlopain
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: number_to_human_sizeで負数を扱えるよう修正

🔗 Ignore implicit locals if not declared by templates with strict locals by byroot · Pull Request #49782 · rails/rails

暗黙のlocalsを受け取れないテンプレートをコレクションレンダリングしたときに注入されるlocalsを自動的に破棄するよう修正。

コレクションをレンダリングすると2つの変数が注入されるため、strictなlocalsを使うテンプレートが壊れていた。

修正によって、テンプレートが実際にそれらの変数を受け取り可能な場合にのみ、それらの変数が渡されるようになった。

Yasha KrasnouJean Boussier
同CHANGELOGより

関連: Allow templates to define which locals they accept by joelhawksley · Pull Request #45602 · rails/rails

🔗 Fix rails-ujs auto start() in bundled environments [7-1-stable] by skipkayhil · Pull Request #49773 · rails/rails

JSバンドラーを使ったときに@rails/ujsstart()を余分な回数呼び出していたのを修正。

Hartley McGuireRyunosuke Sato
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: @rails/ujsを7.1.0にしたときの読み込みエラーを修正

🔗 Fix capture view helper for HAML and Slim by casperisfine · Pull Request #49612 · rails/rails

captureビューヘルパーと、HAMLやSlimとの互換性を修正。

HAMLやSlim(他のテンプレートエンジンでも起きる可能性あり)で空文字列""captureされるとバッファ全体が返される問題を修正。

Jean Boussier
同CHANGELOGより

参考: 週刊Railsウォッチ20231024: captureビューヘルパーがHAMLやSlimで空文字列""をキャプチャしたときの振る舞いを修正

🔗 Action Pack

🔗 Preload Selenium driver_path before parallelizing system tests by mattbrictson · Pull Request #49908 · rails/rails

システムテストをパラレルで実行するとText file busy - chromedriverエラーが発生する可能性のある競合状態を修正。

Matt Brictson
同CHANGELOGより

🔗 Fix StrongParameters#extract_value to include blank values by fatkodima · Pull Request #49749 · rails/rails

StrongParameters#extract_valueが空の値も含められるよう修正。

さもないと、コンポーネントの1つが空文字列""の場合に複合パラメータを正しくパースできなくなる可能性がある。

fatkodimaYasha KrasnouMatthias Eiglsperger
同CHANGELOGより

参考: 週刊Railsウォッチ20231107: レコードの第2主キー以降が空文字列""の場合にurl_helpersが無効なURLを生成する問題を修正

🔗 Add racc dependency because it will be bundled by skipkayhil · Pull Request #49722 · rails/rails

racc gem(LALR(1)パーサージェネレータ)を依存性に追加(Ruby 3.4.0からはbundled gemとなる予定)。

Hartley McGuire
同CHANGELOGより

ruby/racc - GitHub

🔗 Support handling Enumerator for non-buffered responses by zzak · Pull Request #49616 · rails/rails

バッファされていないレスポンスでEnumeratorを扱えるよう修正。

Zachary Scott
同CHANGELOGより

参考: 週刊Railsウォッチ20231024: response_bodyにEnumeratorを渡すとエラーになるのを修正

🔗 Action Text

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

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

Matias Grunberg
同CHANGELOGより


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

Matias Grunberg

同CHANGELOGより

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

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

Hartley McGuire
同CHANGELOGより


TrixをSprocketsで利用する場合の問題を修正。

Hartley McGuire
同CHANGELOGより

🔗 Railties

🔗 Fix running db:system:change with no Dockerfile by skipkayhil · Pull Request #49988 · rails/rails

アプリにDockerfileがない場合にdb:system:changeを実行するとエラーになる問題を修正。

Hartley McGuire
同CHANGELOGより

🔗 Do not memoize auto/eager load paths in engines by fxn · Pull Request #49636 · rails/rails

config.eager_load_paths(または類似の設定)にアクセスすると、config.pathsに対する後からの変更がオートロードパスやeager loadパスに期待通りに反映されなかった問題を修正。

このバグはRails 3から潜んでいた。

修正: #49629

Xavier Noria
同CHANGELOGより


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

関連記事

Rails 7.0.4、6.1.7、6.0.6がリリースされました


CONTACT

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