`ActiveModel::Conversion#render_in` のデフォルト実装を一時的に差し戻し

rails/rails

#57349 で追加された ActiveModel::Conversion#render_in のデフォルト実装が、未リリースの段階で発覚したエッジケースを理由に差し戻されました。再設計後に改めて取り込む方針です。

背景

元のPR #57349 は、ActiveModel::Conversion にデフォルトの #render_in 実装を追加し、モデルインスタンスをビューパーシャルに直接渡してレンダリングできるようにするものでした。この実装により、render personrender renderable: person といった呼び出しが to_partial_path を経由してパーシャルへ委譲される挙動が提供されます。

しかし、マージ後のコメント(#57349のコメント)で重大なエッジケースが指摘されました。コントローラーベースのビューパーシャル名前空間(controller-based view partial namespacing) がレンダリングコンテキストに基づいて適用されない、という問題です。

ActiveModel::Conversion#render_in はまだリリースされていないため、後方互換性を壊さずに差し戻しが可能でした。本PRはその差し戻しを実施し、エッジケースに対応した改訂版PRを改めて提出する方針を取っています。

技術的な変更

本PRは 241f2a0 を完全に差し戻すものです。変更は複数のファイルにわたります。

activemodel/lib/active_model/conversion.rb から、以下の render_in メソッドが削除されました。

def render_in(view_context, **options, &block)
  options.delete(:object)
  view_context.render(partial: to_partial_path, object: self, **options, &block)
end

あわせて、activemodel/lib/active_model/lint.rb から test_render_in テストメソッドが削除され、render_in への応答と文字列返却を検証するリントチェックも取り除かれています。テストファイルについては、activemodel/test/cases/conversion_test.rb から #render_in の挙動を検証する2つのテストケース(デフォルト動作の検証、呼び出し元指定の :object が無視されることの検証)が削除されました。

Action View 側では、actionview/test/actionpack/controller/render_test.rbrenderable_hash コントローラアクションとその対応テストが削除されています。また、actionview/test/template/log_subscriber_test.rb では、render_in 経由のレンダリングで発生していた追加のデバッグログ出力(Rendering Customer ログ)が除去されたことにより、期待ログ件数のアサーションが 2 から 1 に修正されています。

ドキュメントとしては、activemodel/CHANGELOG.md から #render_in 追加に関するエントリが、guides/source/active_model_basics.md から render_in の使用例を示すセクションがそれぞれ削除されました。

設計判断

未リリースであることを理由に差し戻す判断 がされた点が重要です。ActiveModel::Conversion#render_in がまだどのRailsリリースにも含まれていないため、差し戻しによって既存アプリケーションへの影響はゼロです。この前提がなければ、後方互換性の問題から差し戻しではなくパッチ対応が選ばれた可能性があります。

問題の本質は、render_in の実装が view_context.render を直接呼び出す際に、コントローラーのネームスペースに基づいてパーシャルパスを解決する仕組みを持たない点にあります。Railsのパーシャルレンダリングは、呼び出しコンテキスト(どのコントローラーから呼ばれるか)に応じてパスを解釈する場合があり、この挙動を ActiveModel 層の汎用実装として正しく再現するには、追加の設計が必要です。差し戻しとして実装を完全に取り除き、改訂版PR での再提出を選んだことは、中途半端な状態をリリースしないための判断です。

まとめ

本PRは機能追加の取り消しですが、「未リリースであればクリーンに差し戻せる」というリリースサイクルを活かした現実的な対応といえます。コントローラーベースの名前空間という具体的なエッジケースを特定した上で差し戻しを行っており、改訂版PRでの正確な再設計に向けた地ならしとなっています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
5a0f67dc

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「総論→各論→結論」の構成が明確です。リード文で要旨を述べ、背景、技術的な変更、設計判断、まとめ、と論理的に展開されており、非常に分かりやすい構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```言語:ファイルパス)や、PR番号・コミットIDのGitHubリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

「コントローラーベースのビューパーシャル名前空間」などの技術用語を前提として説明しており、専門知識を持つエンジニアという対象読者に適合した内容となっています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論で構成され、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が徹底されており、可読性が非常に高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードブロックや、各ファイルでの変更内容の説明(テストの削除、アサーションの変更など)は、提供されたDiff情報と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PR Descriptionに記載されている「controller-based view partial namespacing」などの技術用語が正確に記事内で使用されており、用語の誤用は見られません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

差し戻しの技術的な理由について、PR情報を基に正確かつ論理的に説明できています。技術的な誤りはありません。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべてPRのタイトル、Description、Diff情報によって裏付けられており、ハルシネーション(捏造)は検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#57349, #57374)やコミットID(241f2a0)などの数値・固有名詞はすべて正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRの主題である「機能の差し戻し」を正確に反映しており、内容との乖離はありません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PRに記載のないLTSやリリース日程などの外部知識は含まれておらず、すべての情報が提供されたソースに基づいています。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

PRに記載された「not yet released」という情報を「未リリース」と正確に表現しており、時間表現の歪曲はありません。