Aggiorna gli URL all'interno di un sondaggio dopo aver cambiato il CDN

Ho creato un sondaggio nel mio forum così:

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

Ho migrato da una CDN a nessuna CDN e gli URL sono cambiati da cdn.unicyclist.com a unicyclist.com.

Tuttavia, gli URL delle immagini qui rimangono rotti, nonostante appaiano correttamente nell’anteprima del post:

Ri-elaborare i post ed eseguire rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' non ha risolto il problema.

ask.discourse.org consiglia:

Cosa sta probabilmente accadendo

Le opzioni del tuo sondaggio non si trovano solo nel testo grezzo del post. Sullo schema del tuo sito, i sondaggi memorizzano anche l’HTML renderizzato delle opzioni in:

  • polls
  • poll_options.html

Quindi l’anteprima del post può sembrare corretta, ma il renderizzatore del sondaggio potrebbe ancora utilizzare HTML obsoleto con il vecchio hostname della CDN.

Documentazione correlata:

Avviso importante

Esegui prima un backup completo.

Inoltre, evita di “modificare semplicemente” il sondaggio se ha voti, perché le modifiche ai sondaggi di solito azzerano i voti:

Approccio più sicuro: ispeziona prima un sondaggio rotto

Nel container:

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

Quindi trova il sondaggio per quel post:

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

Se vedi cdn.unicyclist.com in quell’HTML, ciò lo conferma.

Correggi quel singolo sondaggio

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

Quindi ri-elabora anche quel post:

Post.find(POST_ID).rebake!

Se funziona, correggi in blocco tutte le opzioni del sondaggio

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

Perché posts:remap non ha aiutato

Perché quel rake task è destinato al contenuto dei post, mentre i riferimenti alle immagini rotte sono probabilmente conservati nella cache HTML delle opzioni del sondaggio:

Raccomandazione

  1. testa su un sondaggio rotto
  2. conferma che le immagini vengano caricate
  3. solo allora esegui la correzione in blocco

Se vuoi, posso scriverti uno script pronto da copiare e incollare in cui devi solo sostituire POST_ID ed eseguirlo in sicurezza su un singolo sondaggio prima.

Ti sembra a posto? Farò ovviamente un backup prima, ma preferirei evitare di dover ripristinare il mio forum.

Devo mantenere tutti i risultati dei sondaggi :slight_smile:

Domanda extra: Discourse dovrebbe gestire nativamente questi casi?