URLs in einer Umfrage nach CDN-Wechsel aktualisieren

Ich habe in meinem Forum eine Umfrage erstellt, die so aussieht:

[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]

Ich habe von einem CDN auf keinen CDN gewechselt, und die URLs wurden von cdn.unicyclist.com zu unicyclist.com geändert.

Allerdings bleiben die Bild-URLs hier defekt, obwohl sie in der Beitragsvorschau erscheinen:

Das Neubacken der Beiträge und das Ausführen von rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' hat das Problem nicht behoben.

ask.discourse.org rät:

Was wahrscheinlich passiert

Die Optionen deiner Umfrage befinden sich nicht nur im rohen Beitragstext. In deiner Schema-Datenbank speichern Umfragen auch den gerenderten HTML-Code der Optionen in:

  • polls
  • poll_options.html

Daher kann die Beitragsvorschau korrekt aussehen, während der Umfrage-Renderer möglicherweise noch veralteten HTML-Code mit dem alten CDN-Hostnamen verwendet.

Verwandte Dokumentation:

Wichtige Warnung

Mache zuerst ein vollständiges Backup.

Außerdem vermeide es, die Umfrage einfach zu bearbeiten, wenn sie bereits Stimmen enthält, da Umfragebearbeitungen normalerweise die Stimmen zurücksetzen:

Sicherer Ansatz: Inspektiere zuerst eine defekte Umfrage

Im Container:

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

Finde dann die Umfrage für diesen Beitrag:

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

Wenn du cdn.unicyclist.com in diesem HTML siehst, bestätigt das die Vermutung.

Behebe diese eine Umfrage

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

Backe den Beitrag anschließend ebenfalls neu:

Post.find(POST_ID).rebake!

Wenn es funktioniert, behebe alle Umfrageoptionen im Bulk

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

Warum posts:remap nicht geholfen hat

Weil diese Rake-Task für Beitragsinhalte gedacht ist, während deine defekten Bildreferenzen wahrscheinlich im HTML-Cache der Umfrageoptionen gespeichert sind:

Empfehlung

  1. Teste es an einer defekten Umfrage
  2. Bestätige, dass die Bilder geladen werden
  3. Führe erst dann die Massenbehebung aus

Wenn du möchtest, kann ich dir ein Copy-Paste-Skript schreiben, bei dem du nur POST_ID ersetzen musst und es zuerst sicher an einer einzelnen Umfrage ausführst.

Sieht das für dich gut aus? Ich mache natürlich vorher ein Backup, aber ich würde gerne vermeiden, mein Forum wiederherstellen zu müssen.

Ich muss alle Umfrageergebnisse behalten :slight_smile:

Bonusfrage: Sollte Discourse solche Fälle nicht nativ behandeln?