概要
「メディアレビュー」チェック(skip_review_media_groups サイト設定)は、NewPostManager における投稿作成時のみ適用されます。編集は PostRevisor を通じて行われますが、これはメディアチェックを実行しません。そのため、ユーザーはまずプレーンテキストを投稿して(レビューを通過し)、その後編集で画像を追加することができます。この場合、投稿はレビューキューに送られることはありません。
さらに悪いことに、編集が editing_grace_period(デフォルト5分)以内に行われ、差分が editing_grace_period_max_diff(デフォルト100文字——単一のアップロード画像のマークダウン行は約40〜60文字)より小さい場合、その編集は改訂履歴や鉛筆アイコンを作成しません。そのため、この回避行動はUI上完全に不可視となります。
再現手順
skip_review_media_groupsを設定し、一般ユーザー(例:TL0/TL1)が除外されないようにします。メディアを含む投稿は承認が必要となります。- 一般ユーザーとして、テキストのみを含む投稿を作成します。通常通り承認/投稿されます(メディアなし → レビュー不要)。
- グレース期間内に投稿を編集し、アップロードした画像を挿入します。
期待される結果
(現在メディアを含む)投稿はレビューキューに送られるか、少なくとも編集は投稿作成時と同じメディアチェックの対象となるはずです。
実際の結果
- 画像付きの投稿が公開され、レビューキューには送られません。
- 改訂履歴は作成されず、編集のインジケーターも表示されません。
証拠(本番インスタンス)
p.version # => 1
PostRevision.where(post_id: p.id).count # => 0
p.created_at # => 2026-07-30 07:33:28 UTC
p.updated_at # => 2026-07-30 07:34:00 UTC
UploadReference.where(target: p).pluck(:created_at)
# => [2026-07-30 07:34:01 UTC]
07:33:28 にテキストのみで投稿が作成され、約32秒後に編集で画像が追加されました。可視の編集履歴はなく、レビューも発生していません。
関連コード
- lib/new_post_manager.rb —
post_needs_approval?はcontains_embedded_media?を通じて:contains_mediaを返しますが、これは新規投稿時のみ実行されます。 - app/models/post_analyzer.rb#embedded_media_count — メディアカウントのロジック。
- PostRevisor — 編集時に同等のメディアチェックがありません。
提案される修正
PostRevisor でも contains_media チェックを実行してください(編集がメディアを導入し、編集者が skip_review_media_groups に属さず、スタッフでもない場合)。編集された投稿の ReviewablePost をキューに投入します。