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

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

Ruby on Rails 7.0.4、6.1.7、6.0.6がリリースされました。ほとんどの変更は7.0.4のみに含まれており、6.1.7と6.0.6の変更はわずかです。

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

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

Rails 5.x系以前のリリースは終了しているので更新はありません。
参考: Ruby on Rails のメンテナンスポリシー – Railsガイド

🔗 更新の概要

以下は7.0.4のChangelogです。6.1.7と6.0.6の変更は少ないので、該当部分にその旨を記します。

🔗 Changelogに更新が記載されている機能

以下の機能はリリースノートの記載順です。

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

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

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

🔗 Action Pack

  • Redisキャッシュストアがredis-rb 5.0と互換性を持つようになった

Jean Boussier


  • カスタムActiveSupport::DeprecationNoMethodErrorが発生する振る舞いを修正

ActiveSupport::Deprecation.behavior=callに応答する任意のオブジェクトを受け取れる前提だったが、実際の内部実装ではそのオブジェクトがarityに応答できることが前提になっていたため、Procオブジェクトしか受け取れなかった。
この変更によって、カスタマイズした振る舞いにおけるarityの制約が削除された。
Ryo Nakamura

週刊Railsウォッチ「先週の改修」関連エントリ: ActiveSupport::Deprecationの振る舞いをカスタマイズしたときのNoMethodErrorを修正

🔗 Active Model

  • 属性メソッドコードの生成キャッシュでの名前衝突を解消

2つの異なるメソッドが同じような名前を生成し、1つ目の実装が誤って再利用されることがあった。

class A
  attribute_method_suffix "_changed?"
  define_attribute_methods :x
end

class B
  attribute_method_suffix "?"
  define_attribute_methods :x_changed
end

Jean Boussier

関連issue: Rails7.X: Cache of attribtute method definistions will be applied to methods with different target. · Issue #45416 · rails/rails

🔗 Active Record

  • YAMLのカラムでシンボルをデフォルトで利用できるようになった

Étienne Barrié


  • ActiveRecord::Storeが正規のハッシュでシリアライズするよう修正

従来はActiveSupport::HashWithIndifferentAccessとしてシリアライズしていたが、これは無駄が多く、YAMLのsafe_loadで問題が発生する。

Jean Boussier

関連issue: 7.0.3.1 breaks ActiveRecord.store with yaml coders. · Issue #45585 · rails/rails


  • PostgreSQLでタイムゾーンに対応するtimestamptz型を追加

データベース内のtimestamp with time zone値を正しく解析するにはこれが必要。
これをオフにしたい場合は、以下をイニシャライズに追加できる。

ActiveRecord::Base.time_zone_aware_types -= [:timestamptz]

Alex Ghiculescu


  • 配列型カラムのtsrangeおよびtstzrangeのタイムゾーンサポートを修正
# データベースマイグレーション
add_column :shops, :open_hours, :tsrange, array: true
# アプリのコンフィグ
ActiveRecord::Base.time_zone_aware_types += [:tsrange]
# コードで時刻が正しくアプリのタイムゾーンに変換される
Shop.create!(open_hours: [Time.current..8.hour.from_now])

Wojciech Wnętrzak

Rails API: tsrangeActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods
Rails API: tstzrangeActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods


  • リレーションのcache_versionがstaleする場合がある問題を修正

従来は、リレーションオブジェクトでresetが呼び出されたときにcache_versionsインスタンス変数がリセットされなかった。これによって、データが正しいにもかかわらずリレーションのcache_versionsがstaleしていると報告されて混乱状況になる。

使い方:

developers = Developer.all
developers.cache_version

Developer.update_all(updated_at: Time.now.utc + 1.second)

developers.cache_version # cache_versionはstaleしている
developers.reset
developers.cache_version # 最新の正しいcache_versionが返される

Austen Madden

関連issue: AR Relation #reset method does not correctly reset cache_version · Issue #45341 · rails/rails
週刊Railsウォッチ「先週の改修」関連エントリ: Active Recordリレーションのresetcache_versionがリセットするよう修正


  • load_asyncを関連付けプロキシで呼び出したときの振る舞いを修正

関連付けでload_asyncが直接呼び出されると、クエリはスケジューリングされるがまったく使われなかった。

comments = post.comments.load_async # クエリがスケジューリングされる
comments.to_a # まったく新しい同期クエリが実行される

修正によって非同期クエリを使うようになった。ただしこの関連付けは読み込まれないことに注意。
Jean Boussier

関連issue: Is load_async supposed to work on associations? · Issue #45408 · rails/rails


  • 主キーのないモデルのeager loadingを修正

Anmol Chopra, Matt Lawrence, and Jonathan Hefner

関連issue: model w/o primary key defined as association beeing eager loaded is not populated · Issue #29374 · rails/rails
週刊Railsウォッチ「先週の改修」関連エントリ: 主キーのないモデルのeager_loadを修正


  • rails db:schema:{dump,load}でコンフィグより前にENV["SCHEMA_FORMAT"]がチェックされるようになった

rails db:structure:{dump,load}は非推奨化されたため、SQLフォーマットとRubyフォーマットの両方のスキーマをダンプするシンプルな方法がなかった。この変更によって、以下のように環境変数で指定できるようになる。

SCHEMA_FORMAT=sql rake db:schema:dump

Alex Ghiculescu

週刊Railsウォッチ「先週の改修」関連エントリ: db:schemaのダンプや読み込みのスキーマフォーマットを環境変数で指定できるようになった


hstoreデシリアライズのリグレッションバグを修正
edsharp

参考: PostgreSQL 14ドキュメント F.16. hstore


以下は6.1.7のみが対象です

Ruby 2.7でPG.connectキーワード引数の非推奨警告を表示
Nikita Vasilevsky

🔗 Action View

  • ActionView::Helpers::FormTagHelper#field_name呼び出しで以下のようなobject_name引数がnilの場合をガードするようになった
<%= fields do |f| %>
  <%= f.field_name :body %>
<% end %>

Sean Doyle

週刊Railsウォッチ「先週の改修」関連エントリ: #field_nameヘルパー呼び出しでobject_name引数にnilを渡せるようになった


  • strip_tagsから返される文字列がhtml_safe?で正しくタグ付けされるようになった

これらの文字列にはHTML要素が含まれておらず、基本エンティティはエスケープされるため、HTMLコンテンツにそのままPCDATAとして含めても安全。html-safeとしてタグ付けすることで、レンダリング中にSafeBufferにつないだときの二重エスケープが回避される。

修正されたissue: strip_tags(input).html_safe? # => false to true ? · Issue #124 · rails/rails-html-sanitizer

Mike Dalessio

週刊Railsウォッチ「先週の改修」関連エントリ: strip_tagsから返される文字列がhtml_safe?で正しくタグ付けされるよう修正

🔗 Action Pack

  • ActionDispatch::ServerTimingServer-Timingヘッダー内の既存の値を上書きしないよう修正

従来は別のミドルウェアがServer-Timingヘッダーを設定するとActionDispatch::ServerTimingで上書きされてしまっていた。

Jakub Malinowski

関連issue: ActionDispatch::ServerTiming overwrites instead of appending to the Server-Timing header. · Issue #45607 · rails/rails
週刊Railsウォッチ「先週の改修」関連エントリ: ActionDispatch::ServerTimingが既存のServer-Timingヘッダーを上書きしないよう修正

🔗 Active Job

  • ActiveJob::QueueAdapters::QueAdapterの非推奨警告を削除

Ruby 3との互換性のために必要となるque 2.0の変更に備えて、que 1.2で導入された非推奨警告を削除する。
Damir Zekic and Adis Hasovic

🔗 Action Cable

  • Redisキャッシュストアがredis-rb 5.0と互換性を持つようになった

redis-rb 3.xとの互換性は削除された。

Jean Boussier


  • Action Cableサーバーがanchor: trueでマウントされるようになった

これによって、/cableで始まるルーティングがAction Cableでクラッシュしなくなる。
Alex Ghiculescu

週刊Railsウォッチ「先週の改修」関連エントリ: Action Cableサーバーをanchor: trueでマウントするようになった

🔗 Active Storage

  • プロキシモードで5MBを越えるファイルのダウンロードを修正

従来は、S3などのサービスに保存されている5MB以上のファイルをプロキシモードでダウンロードしようとすると、5.2MBのあたりで破損したファイルが返されたり、ダウンロードがランダムに停止することがあった。ActiveStorage::Blobs::ProxyControllerが正しくストリーミングを扱うよう修正されたことで、巨大なファイルをサーバーからクライアントに問題なくストリーミングできるようになった。

Felipe Raul

関連issue: ActiveStorage::Blobs::ProxyController breaks http1.x chunked responses by setting Content-Length Header by trcarden · Pull Request #44679 · rails/rails

🔗 Railties

  • config.allow_concurrency = falseを指定したときにMutexではなくMonitor`使うようになった

これによって、config.allow_concurrencyを無効にしてもconfig.active_support.executor_around_test_caseを有効にできるようになった。
Jean Boussier

関連issue: Enabling executor_around_test_case and disabling allow_concurrency fails controller tests · Issue #45852 · rails/rails
Rails API: Rails::Application::Finisher::MutexHook


  • アプリでActive Jobをスキップしている場合はActive StorageとAction Mailerもスキップするよう修正
    Étienne Barrié

  • フレームワーク機能が無効かどうかをapp:update実行時に正しくチェックするよう修正
    Étienne Barrié and Paulo Barros

週刊Railsウォッチ「先週の改修」関連エントリ: app:update実行時に機能がconfig/application.rbで無効になっているかをチェックするようになった


  • config.active_support.cache_format_versionが今後決して適用されないよう修正

Rails 7.0のRails.cacheでは新しいシリアライザが使われるようになったが、関連コンフィグが正しく動いていなかった。なお、この修正が行われた後でも、この適用はapplication.rbファイルでしか利用できない点に注意。

Alex Ghiculescu

関連issue: Rails.cache uses 6.1 coder when 7.0 configuration defaults are loaded · Issue #45289 · rails/rails


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

関連記事

Rails 7.0.3、6.1.6、6.0.5、5.2.8がリリースされました

Railsセキュリティ修正7.0.3.1、6.1.6.1、6.0.5.1、5.2.8.1がリリースされました


CONTACT

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