ActionText::Attachableのメソッド可視性をpublicに変更

rails/rails

ActionText::Attachable#read_attribute_for_serialization メソッドがpublicに変更されました。これにより、active_model_serializers を使用したシリアライズ時のエラーが解消されます。

背景

ActionText::Attachableread_attribute_for_serialization をprivateメソッドとしてオーバーライドしていました。しかし、#49272 以降、元となる ActiveModel::Serialization#read_attribute_for_serialization#53042 でpublicメソッドに変更されています。

この可視性の不一致により、active_model_serializers でモデルをシリアライズする際に「privateメソッドを呼び出した」というエラーが発生していました。rails-api/active_model_serializers#2457 で報告された問題です。

外部ライブラリが期待するpublicインターフェースとの整合性が失われたことが、この問題の原因でした。

技術的な変更

actiontext/lib/action_text/attachable.rbread_attribute_for_serialization メソッドの定義位置が変更され、可視性がpublicになりました。

変更前:

private
  def attribute_names_for_serialization
    super + ["attachable_sgid"]
  end

  def read_attribute_for_serialization(key)
    if key == "attachable_sgid"
      persisted? ? super : nil
    else
      super
    end
  end

変更後:

# See ActiveModel::Serialization#read_attribute_for_serialization.
def read_attribute_for_serialization(key)
  if key == "attachable_sgid"
    persisted? ? super : nil
  else
    super
  end
end

private
  def attribute_names_for_serialization
    super + ["attachable_sgid"]
  end

メソッド定義が private 宣言の外に移動され、ドキュメントコメントが追加されています。メソッドの実装内容は変更されていません。

テストでは、メソッドが外部から呼び出せることを確認するケースが追加されました:

test "read_attribute_for_serialization returns the attribute" do
  attachable = ActiveStorage::Blob.create_after_unfurling!(io: StringIO.new("test"), filename: "test.txt", key: 123)

  assert_equal(attachable.key, attachable.read_attribute_for_serialization(:key))
end

設計判断

オーバーライドするメソッドの可視性に合わせる方針 が採用されました。

ActiveModel::Serialization のドキュメントは read_attribute_for_serialization をカスタマイズポイントとして明示的に言及しており、#53042 でpublicに昇格された経緯があります。Rails内部でのみ使用されるメソッドではなく、外部ライブラリが依存する可能性のあるインターフェースとして位置づけられています。

ActionText::Attachable がこのメソッドをprivateとしてオーバーライドすることは、親クラスのインターフェース設計と矛盾していました。可視性を揃えることで、Liskov置換原則に従った設計になっています。

まとめ

本PRは、親クラスの可視性変更に追従してメソッドをpublicに変更した修正です。メソッドの実装を変えずに定義位置のみを移動することで、active_model_serializers などの外部ライブラリとの互換性を回復しています。オーバーライドする側がインターフェース設計に従うという、オブジェクト指向の基本原則に沿った対応といえます。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事は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番号・Issue番号のリンク記法ともに正しく使用されています。

対象読者への適合性 ✓ PASS

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

メソッドの可視性やライブラリ間の互換性といった専門的なトピックを扱っており、対象読者であるエンジニアに適した内容です。

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

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

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

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは、Diffで示された変更内容(メソッドの移動、テストの追加)を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

ActionText::Attachable, active_model_serializers, メソッドの可視性など、関連する技術用語を正確に使用しています。

説明の技術的正確性 ✓ PASS

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

親クラスとの可視性の不一致がエラーの原因であるという説明は、PRのDescriptionと技術的背景に完全に一致しており、正確です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiffの内容によって裏付けられています。「設計判断」でLiskov置換原則に言及している点は、PRの意図を補強する妥当な技術的解説であり、ハルシネーションではありません。

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

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

関連するPR番号(#49272, #53042)やIssue番号(rails-api/active_model_serializers#2457)が正確に記載・リンクされています。

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

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

記事のタイトルは、PRのタイトル「Make `ActionText::Attachable#read_attribute_for_serialization` public」の内容を日本語で正確に表現しています。

外部知識の正確性 ✓ PASS

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

Liskov置換原則への言及はありますが、これは変更の背景を説明するための妥当な技術的解説であり、根拠のない外部知識の捏造にはあたりません。

時間表現の正確性 ✓ PASS

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

「[#49272] 以降」「[#53042] で変更されています」といった時間的な前後関係の表現は、PRの記述と一致しており正確です。