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

Rails 8.1.0.beta1のChangelog: Active Support(全項目リンク付き)

🔗 Active Support CHANGELOG

参考: Release 8.1.0.beta1 · rails/rails
参考: コミットリスト: Comparing v8.0.2.1...v8.1.0.beta1 · rails/rails

🔗 Allow getter and setter for options[:namespace] in ActiveSupport::Cache::Store by byroot · Pull Request #55580 · rails/rails

ActiveSupport::Cache::Store#namespace=#namespace.を追加。パラレルテストなどで状況によってはStore#clearの代わりに利用可能。

Nick Schwaderer
同Changelogより

🔗 Creates parallel_worker_id helper for running parallel tests by Schwad · Pull Request #55565 · rails/rails

パラレルテスト実行用のparallel_worker_idを作成。テスト中にどのワーカーが現在実行中かを知ることが可能になる。

Nick Schwaderer

同Changelogより

🔗 Make local cache middleware updatable by gmcgibbon · Pull Request #55553 · rails/rails

ActiveSupport::Cache::Strategy::LocalCache::Middlewareが更新可能になった。

起動したアプリケーションのRails.cacheにあるキャッシュクライアントが変更された場合は、リクエストローカルキャッシュを適切に設定するために、それに対応するマウント済みミドルウェアを更新する必要がある。さもないと、冗長なキャッシュ操作によって誤ってデータストアにアクセスしてしまう。

Gannon McGibbon
同Changelogより

🔗 Add #assert_events_reported test helper by george-ma · Pull Request #55497 · rails/rails

assert_events_reportedテストヘルパーをActiveSupport::EventReporterに追加。この新しいアサーションによって、複数のイベントを順序と無関係に単一のブロック内でテストできるようになる。

assert_events_reported([
  { name: "user.created", payload: { id: 123 } },
  { name: "email.sent", payload: { to: "user@example.com" } }
]) do
  create_user_and_send_welcome_email
end

George Ma
同Changelogより

🔗 Add AS::TimeZone#standard_name method by bogdan · Pull Request #53199 · rails/rails

ActiveSupport::TimeZone#standard_nameメソッドを追加。

zone = ActiveSupport::TimeZone['Hawaii']
# 従来
ActiveSupport::TimeZone::MAPPING[zone.name]
# 新しい方法
zone.standard_name # => 'Pacific/Honolulu'

Bogdan Gusiev

🔗 Structured Event Reporting in Rails by adrianna-chang-shopify · Pull Request #55334 · rails/rails

Rails.eventでアクセス可能な「Structured Event Reporter」を追加。

このイベントレポーター機能は、Railsアプリケーション内で構造化されたイベントを生成する共通インターフェイスを提供する。

Rails.event.notify("user.signup", user_id: 123, email: "user@example.com")

イベントへのタグ追加をサポートする。

Rails.event.tagged("graphql") do
  # イベントが{ graphql: true }タグを含む
  Rails.event.notify("user.signup", user_id: 123, email: "user@example.com")
end

コンテキストも追加できる。

# すべてのイベントが{request_id: "abc123", shop_id: 456}コンテキストを含む
Rails.event.set_context(request_id: "abc123", shop_id: 456)

イベントはサブスクライバに送信される。アプリケーションはサブスクライバを登録することで、イベントのシリアライズと送信方法を制御可能になる。サブスクライバは、イベントハッシュを受け取る#emitメソッドを実装する必要がある。

class LogSubscriber
  def emit(event)
    payload = event[:payload].map { |key, value| "#{key}=#{value}" }.join(" ")
    source_location = event[:source_location]
    log = "[#{event[:name]}] #{payload} at #{source_location[:filepath]}:#{source_location[:lineno]}"
    Rails.logger.info(log)
  end
end

Adrianna Chang
同Changelogより

🔗 [Fix #55460] Make ActiveSupport::Logger #freeze-friendly by joshuay03 · Pull Request #55465 · rails/rails

ActiveSupport::Logger#freezeしてもFrozenErrorをraiseしないようになった。

Joshua Young
同Changelogより

🔗 Make ActiveSupport::Gzip.compress deterministic by Mr0grog · Pull Request #55382 · rails/rails

ActiveSupport::Gzip.compressを入力に対して決定論的に振る舞うよう修正。

従来のActiveSupport::Gzip.compressは出力にタイムスタンプを含んでいたため、呼び出しの瞬間の秒数が異なっていると同じ入力データに対して出力が異なってしまっていた。修正後はタイムスタンプが常に0に設定されるため、同じ入力に対して常に同じ出力を得られるようになった。

Rob Brackett
同Changelogより

🔗 Implement ActiveSupport::BacktraceCleaner#clean_locations by fxn · Pull Request #55255 · rails/rails

新しいActiveSupport::BacktraceCleaner#clean_locationsメソッドにThread::Backtrace::Locationオブジェクトの配列を渡すとオブジェクトのクリーンな配列を返すようになった。

clean_locations = backtrace_cleaner.clean_locations(caller_locations)

フィルタとサイレンサーは従来通り文字列を受け取る。ただしlocationsはイミュータブルなので、受け取った配列内のlocationsのpath属性は元のフィルタなしの状態のままとなる。

Xavier Noria
同Changelogより

🔗 Allow for nested ExecutionContext in test by byroot · Pull Request #55247 · rails/rails

テストケースにおけるCurrentAttributesExecutionContextのステート管理を改善。

これら2つのグローバルステートは、Rails executorでラップされたコード内(通常はAction ControllerやActive Jobのヘルパー)から呼び出されるたびに、完全にクリアされていた。

test "#index works" do
  CurrentUser.id = 42
  get :index
  CurrentUser.id == nil
end

改修後は、executorに再び入るときにステートを適切に保存して復元するようになった。

Jean Boussier
同Changelogより

🔗 Implement ActiveSupport::BacktraceCleaner#first_clean_location by fxn · Pull Request #55230 · rails/rails

新しいActiveSupport::BacktraceCleaner#first_clean_locationメソッドは、呼び出し元のコールスタックの最初のクリーンなlocationまたはnilを返す。このlocationはThread::Backtrace::Locationである。
何か問題が発生したオブジェクトでアプリケーションレベルのlocationを(文字列ではなく)オブジェクトとして報告したい場合に有用。

Xavier Noria
同Changelogより

🔗 perf FileUpdateChecker, ignore gems paths by ermolaev · Pull Request #54129 · rails/rails

パフォーマンス改善のためFileUpdateCheckerEventedFileUpdateCheckerGem.pathの変更を監視しないようになった。

Ermolaev Andreyzzak
同Changelogより

🔗 Implement ActiveSupport::BacktraceCleaner#first_clean_frame by fxn · Pull Request #55222 · rails/rails

新しいActiveSupport::BacktraceCleaner#first_clean_frameメソッドは、呼び出し元のコールスタックの最初のクリーンなフレームまたはnilを返す。何か問題が発生したオブジェクトでアプリケーションレベルのフレームを文字列として報告したい場合に有用。

Xavier Noria
同Changelogより

🔗 Allow for nested ExecutionContext in test by byroot · Pull Request #55247 · rails/rails

CurrentAttributesインスタンスをリクエスト終了時に常に破棄するようになった。

従来のCurrentAttributesインスタンスは、リクエスト終了時に属性を再初期化する目的で、属性を(破棄せずに)リセットしていた。

これは、そのオブジェクトでは宣言された属性以外にステートを保持していないことを前提としている点に問題がある。実際には必ずしもステートを保持しないとは限らず、その場合リクエスト間でステートが漏洩する可能性があった。

修正後はリクエスト終了時にCurrentAttributesインスタンスが常に破棄されるようになったため、次のリクエスト開始時に新しいインスタンスが作成されるようになった。

Jean BoussierJanko Marohnić
同Changelogより

🔗 Add public API for before_fork_hook in parallel testing by eileencodes · Pull Request #54985 · rails/rails

パラレルテストで実装されたbefore_fork_hookを呼び出すためのpublic APIを導入する。

parallelize_before_fork do
    # テストプロセスがforkする直前にアクションを実行する
end

Eileen M. Uchitelle
同Changelogより

🔗 Implement ability to opt out of parallel database hooks by eileencodes · Pull Request #54984 · rails/rails

パラレルテストでデータベース作成をスキップする機能を実装した。

Railsのパラレルテストでは、プロセスごとにデータベースが作成される。この振る舞いが望ましくない場合や、データベース処理を独自に実装したい場合は、このデフォルトの振る舞いを無効にできるようになった。

プロセスごとのデータベース作成をスキップするには、parallelizeメソッドで変更する。

parallelize(workers: 10, parallelize_databases: false)

あるいはアプリケーションのコンフィグで指定する。

config.active_support.parallelize_databases = false

Eileen M. Uchitelle
同Changelogより

🔗 Allow to configure maximum cache key sizes by fatkodima · Pull Request #54915 · rails/rails

キャッシュキーのサイズに最大値を設定可能になった。

キーの長さが設定値(デフォルトで250バイト)を超えると、はみ出し分を切り捨て、残ったキーのダイジェストが追加される。

従来のActiveSupport::Cache::RedisCacheStoreでは、切り捨て前のキャッシュキーサイズが最大1kbになっていたが、現在は250バイトに削減された。

config.cache_store = :redis_cache_store, { max_key_size: 64 }

fatkodima
同Changelogより

注: ActiveSupport::Cache::RedisCacheStoreキャッシュキー最大サイズのデフォルト値が変更されたことで、既存のRailsアプリケーションで250バイトを超えるキャッシュキーが使われている場合にキャッシュが無効になる可能性が考えられます(レビューコメントによると250バイトを超えることはめったにないだろうとされていますが)。

🔗 Use UNLINK for RedisCacheStore in ActiveSupport by roharon · Pull Request #54861 · rails/rails

ActiveSupport::Cache::RedisCacheStoreで従来のDELコマンドではなくUNLINKコマンド(ブロッキングしないため高速)を使うよう変更された。

Aron Roh
同Changelogより

🔗 Add Cache#read_counter and Cache#write_counter by ghiculescu · Pull Request #54855 · rails/rails

Cache#read_counterメソッドとCache#write_counterメソッドが追加された。

Rails.cache.write_counter("foo", 1)
Rails.cache.read_counter("foo") # => 1
Rails.cache.increment("foo")
Rails.cache.read_counter("foo") # => 2

Alex Ghiculescu
同Changelogより

🔗 Introduce capture_error_reports by andrewn617 · Pull Request #54809 · rails/rails

ActiveSupport::Testing::ErrorReporterAssertions#capture_error_reportsを導入した。

指定のエラークラスと一致するブロック内で発生したエラーをすべてキャプチャする。

reports = capture_error_reports(IOError) do
  Rails.error.report(IOError.new("Oops"))
  Rails.error.report(IOError.new("Oh no"))
  Rails.error.report(StandardError.new)
end

assert_equal 2, reports.size
assert_equal "Oops", reports.first.error.message
assert_equal "Oh no", reports.last.error.message

Andrew Novoselac
同Changelogより

🔗 Introduce ActiveSupport::ErrorReport#add_middleware by andrewn617 · Pull Request #54512 · rails/rails

ActiveSupport::ErrorReporter#add_middlewareメソッドを導入。

エラーを報告する際、報告されたエラーとベース実行コンテキストを引数として、エラーコンテキストミドルウェアが呼び出されるようになった。
スタックはコンテキストハッシュを変更することが許されており、変更されたコンテキストはエラーサブスクライバに渡される。ミドルウェアはErrorReporter#reportと同じパラメータを受け取る。

Andrew NovoselacSam Schmidt
同Changelogより

🔗 Allow execution wrapper to handle all exceptions by gmcgibbon · Pull Request #54455 · rails/rails

executorのエラーラッピングを変更して、Exceptionを含むあらゆる例外をレポートするよう変更。

SystemStackErrorNoMemoryErrorといった重大なエラーが発生した場合は、エラーレポーターでもこの種の例外を報告可能にすべき。

Gannon McGibbon
同Changelogより

🔗 Clear AR connections in tests before forking for parallelization by flavorjones · Pull Request #54376 · rails/rails

テストワーカーがforkする直前に呼び出されるコールバックをActiveSupport::Testing::Parallelization.before_fork_hookで宣言可能にした。

Mike Dalessio
同Changelogより

🔗 Allow passing in a date or time to ActiveSupport::Testing::TimeHelpers#freeze_time by joshuay03 · Pull Request #54303 · rails/rails

#freeze_timeテストヘルパーの引数に日付や時刻を渡せるようになった。

Time.current # => Sun, 09 Jul 2024 15:34:49 EST -05:00
freeze_time Time.current + 1.day
sleep 1
Time.current # => Mon, 10 Jul 2024 15:34:49 EST -05:00

Joshua Young
同Changelogより

Rails: Timecopを使わなくても時間を止められた話

🔗 JSON serialized attributes can return symbolized keys by matthaigh27 · Pull Request #54172 · rails/rails

ActiveSupport::JSONに以下のようにオプションを渡せるようになった。

ActiveSupport::JSON.decode('{"key": "value"}', symbolize_names: true) # => { key: "value" }

matthaigh27
同Changelogより

🔗 Update NotificationAssertions's assert_notifcation to match against payload subsets and return matched notification by larouxn · Pull Request #54126 · rails/rails

ActiveSupport::Testing::NotificationAssertions's assert_notificationがデフォルトでペイロードのサブセットに部分マッチするようになった。

従来は、通知ペイロード内のキーバリューが長過ぎるため、以下のアサーションは失敗していた。ペイロードのサブセットにマッチするよう修正されたことで、アサーションがパスするようになった。

assert_notification("post.submitted", title: "Cool Post") do
  ActiveSupport::Notifications.instrument("post.submitted", title: "Cool Post", body: "Cool Body")
end

また、マッチした通知を永続化してアサーションをさらにカスタマイズできるようになった。

notification = assert_notification("post.submitted", title: "Cool Post") do
  ActiveSupport::Notifications.instrument("post.submitted", title: "Cool Post", body: Body.new("Cool Body"))
end

assert_instance_of(Body, notification.payload[:body])

Nicholas La Roux
同Changelogより

🔗 Deprecate String#mb_chars and AS::Multibyte::Chars. by byroot · Pull Request #54081 · rails/rails

String#mb_charsActiveSupport::Multibyte::Charsが非推奨化された。

これらのAPIはRubyの文字列がエンコーディング情報を認識していなかったRuby 1.8時代の遺物であり、今日ではこれらを必要とするまっとうな理由は存在しない。

Jean Boussier
同Changelogより

Rubyの内部文字コードはUTF-8ではない...だと...?!

🔗 Deprecate ActiveSupport::Configurable by seanpdoyle · Pull Request #53970 · rails/rails

ActiveSupport::Configurableが非推奨化された。

Sean Doyle
同Changelogより

🔗 Fix #to_query to not include = for nil values by byroot · Pull Request #53962 · rails/rails

nil.to_query("key")key=ではなくkeyをクエリ文字列として返すよう修正。

従来はkey=がクエリ文字列として返されていたため、Rack::Utils.parse_nested_queryの挙動と合っていなかった。

Erol Fornoles
同Changelogより

🔗 Don't wrap redis in ConnectionPool if already given one for ActiveSupport::Cache::RedisCacheStore by joshuay03 · Pull Request #53845 · rails/rails

ActiveSupport::Cache::RedisCacheStoreを利用している状態で、:redisオプションが既にConnectionPoolの場合はConnectionPool にredisをラップしないよう修正。

Joshua Young
同Changelogより

🔗 Improve error highlighting of multiline methods in ERB templates by martinemde · Pull Request #53763 · rails/rails

ERB::Util.tokenizeのエラーハイライトを改善。文字列にERBタグが含まれていない場合に、完全な入力文字列を含む:PLAINトークンを返すように なった。

Martin Emde
同Changelogより

🔗 Fix multibyte character tokenization bug in ERB::Util by martinemde · Pull Request #53655 · rails/rails

ERB::Util.tokenizeで、ERBタグの前にマルチバイト文字が存在する場合にトークン化がおかしくなるバグを修正。

Martin Emde
同Changelogより

🔗 Add ActiveSupport::Testing::NotificationAssertions test helper module by larouxn · Pull Request #53065 · rails/rails

ActiveSupport::Notificationsのテストを支援するActiveSupport::Testing::NotificationAssertionsモジュールを追加。

Nicholas La RouxYishu SeeSean Doyle
同Changelogより

🔗 Fix CurrentAttributes#attributes to return new object each time by fatkodima · Pull Request #53440 · rails/rails

ActiveSupport::CurrentAttributes#attributesメソッドが呼び出しのたびに新しいハッシュオブジェクトを返すよう修正。

従来は、メソッド呼び出しのたびに同じハッシュオブジェクトを返していた。

fatkodima
同Changelogより

🔗 Add prefix address when IPAddr of CIDR encoded with JSON by taketo1113 · Pull Request #53393 · rails/rails

ActiveSupport::JSON.encodeCIDR記法をサポートするようになった。

従来:

ActiveSupport::JSON.encode(IPAddr.new("172.16.0.0/24")) # => "\"172.16.0.0\""

変更後:

ActiveSupport::JSON.encode(IPAddr.new("172.16.0.0/24")) # => "\"172.16.0.0/24\""

Taketo Takashima
同Changelogより

🔗 Make FileUpdateChecker faster with many extensions by jdelStrother · Pull Request #53680 · rails/rails

ActiveSupport::FileUpdateCheckerで多数のファイル拡張子をチェックするときの速度を改善した。

Jonathan del Strother
同Changelogより

関連記事

速報: Rails World 2025のDHHキーノートとRails 8.1beta1リリース

Rails 8.0 Changelog(全項目リンク付き)

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


CONTACT

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