CDN 変更後にアンケート内の URL を更新する

フォーラムで以下のようなアンケートを作成しました:

[poll name=freestyle type=multiple results=always min=1 max=14 public=true chartType=bar]
* **#1** ![DSC_2281.jpg|332x500, 33%](upload://ujMDcnd4syevNGdEN2O1qUTeWeK)
* **#2** ![IMG_3248.jpg|690x459, 33%](upload://tsecEjlruXEpg3faidWmENBupM4)
[/poll]

CDNからCDNなしへ移行し、URLは cdn.unicyclist.com から unicyclist.com に変更されました。

しかし、投稿プレビューでは正しく表示されているにもかかわらず、ここでの画像URLは壊れたままです:

投稿の再ビルド(rebaking)や rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' の実行でも修正されませんでした。

ask.discourse.org は以下のようにアドバイスしています:

何が起きているのか

アンケートのオプションは、投稿の生データ(raw)だけでなく、サイトスキーマ上でも保存されています。アンケートでは、レンダリングされたオプションのHTMLを以下に保存します:

  • polls
  • poll_options.html

そのため、投稿プレビューは正常に見えても、アンケートレンダラーは古いCDNホスト名を含む古びたHTMLを使用し続けている可能性があります。

関連ドキュメント:

重要な警告

まず完全なバックアップを取ってください。

また、投票がある場合はアンケートを「ただ編集」しないでください。アンケートの編集は通常、投票をクリアするためです:

より安全なアプローチ:壊れたアンケートを1つだけ調査する

コンテナ内で:

cd /var/discourse
./launcher enter app
rails c

その後、その投稿のアンケートを見つけます:

poll = Poll.find_by(post_id: POST_ID, name: "freestyle")
PollOption.where(poll_id: poll.id).pluck(:id, :html)

そのHTMLに cdn.unicyclist.com が含まれている場合、それが原因です。

その1つのアンケートを修正する

poll = Poll.find_by(post_id: POST_ID, name: "freestyle")

PollOption.where(poll_id: poll.id).find_each do |opt|
  new_html = opt.html.gsub("cdn.unicyclist.com", "unicyclist.com")
  opt.update_columns(html: new_html, updated_at: Time.zone.now)
end

その後、その投稿も再ビルドします:

Post.find(POST_ID).rebake!

成功したら、すべてのアンケートオプションを一括修正する

PollOption.find_each do |opt|
  next unless opt.html&.include?("cdn.unicyclist.com")
  opt.update_columns(
    html: opt.html.gsub("cdn.unicyclist.com", "unicyclist.com"),
    updated_at: Time.zone.now
  )
end

なぜ posts:remap が役に立たなかったのか

そのrakeタスクは投稿コンテンツ用であり、壊れた画像参照はおそらくアンケートオプションのHTMLキャッシュにあるからです:

推奨事項

  1. 1つの壊れたアンケートでテストする
  2. 画像が読み込まれることを確認する
  3. その後、一括修正を実行する

よければ、POST_ID だけを置き換えて、最初に1つのアンケートで安全に実行できるコピー&ペースト用スクリプトを作成します。

これは大丈夫そうですか? もちろんまずバックアップを取りますが、フォーラムを復元する必要がないようにしたいです。

すべてのアンケートの結果を保持する必要があります :slight_smile:

ボーナス質問:Discourse はこうしたケースをネイティブに処理すべきでしょうか?