ActionTextの削除済み添付ファイルをプレーンテキストでも「☒」として表示
ActionTextでは、削除済み添付ファイルを to_plain_text で変換する際に、HTML表示と同じ「☒」記号が表示されるようになりました。これにより、HTML・プレーンテキスト・Markdownの全形式で、欠落した添付ファイルの表現が統一されます。
背景
ActionTextでは、削除済みまたは見つからない添付ファイルを MissingAttachable クラスで表現します。HTML形式では「☒」(U+2612、BALLOT BOX WITH X)記号を使って壊れた添付ファイルを示していましたが、Content#to_plain_text を使用した場合は空文字列に置き換えられていました。
この非対称性は、MissingAttachable が attachable_plain_text_representation メソッドを実装していなかったことに起因します。HTML表示とプレーンテキスト表示で異なる挙動となり、削除済み添付ファイルの存在が見えなくなる問題がありました。
技術的な変更
actiontext/lib/action_text/attachables/missing_attachable.rb に attachable_plain_text_representation メソッドが追加されました。
変更後:
def attachable_plain_text_representation(caption = nil)
"☒"
end
このメソッドは、既存の attachable_markdown_representation と同じ「☒」文字を返します。HTML部分テンプレートで使用される記号と統一されることで、すべての出力形式で一貫した表現が得られます。
テストケースも追加され、削除済み添付ファイルが正しく「☒」として変換されることが検証されています:
test "converts missing attachables to plain text" do
file = create_file_blob(filename: "racecar.jpg", content_type: "image/jpeg")
html = %Q(<action-text-attachment sgid="#{file.attachable_sgid}"></action-text-attachment>)
file.destroy!
content = content_from_html(html)
assert_equal "☒", content.to_plain_text
end
設計判断
既存のMarkdown変換との整合性を重視した設計 が採用されました。
MissingAttachable は既に attachable_markdown_representation で「☒」を返していたため、attachable_plain_text_representation も同じ記号を返すことで、出力形式間の一貫性が保たれています。引数の caption を受け取るシグネチャも既存メソッドと揃えられていますが、実装では使用されていません。
PR内の補足情報では、<action-text-attachment> ノードに url や content-type 属性が残っている画像添付ファイルは RemoteImage として解決され、プレーンテキストでは [Image] と表示されることが説明されています。MissingAttachable として扱われるのは、バッキングレコードが完全に失われたケースのみです。この明確な区別により、異なる種類の「見つからない」状態が適切に表現されます。
まとめ
本PRは、ActionTextの出力形式間で削除済み添付ファイルの表現を統一した変更です。attachable_plain_text_representation メソッドの追加により、HTML・プレーンテキスト・Markdownの全形式で「☒」記号が使用されるようになり、ユーザーは出力形式に関わらず壊れた添付ファイルの存在を認識できるようになりました。