Actualizar las URL dentro de una encuesta después de cambiar el CDN

He creado una encuesta en mi foro así:

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

Migré de un CDN a no usar CDN, y las URLs cambiaron de cdn.unicyclist.com a unicyclist.com.

Sin embargo, las URLs de las imágenes aquí siguen rotas, a pesar de aparecer correctamente en la vista previa del mensaje:

Rehacer la vista previa de los mensajes y ejecutar rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' no lo solucionó.

ask.discourse.org aconseja:

Lo que probablemente esté ocurriendo

Las opciones de tu encuesta no solo están en el texto crudo del mensaje. En el esquema de tu sitio, las encuestas también almacenan el HTML renderizado de las opciones en:

  • polls
  • poll_options.html

Por lo tanto, la vista previa del mensaje puede parecer correcta, pero el renderizador de la encuesta puede seguir utilizando HTML obsoleto con el nombre de host antiguo del CDN.

Documentación relacionada:

Advertencia importante

Haz una copia de seguridad completa primero.

Además, evita “simplemente editar” la encuesta si ya tiene votos, porque las ediciones de encuestas normalmente borran los votos:

Enfoque más seguro: inspecciona primero una encuesta rota

Dentro del contenedor:

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

Luego encuentra la encuesta correspondiente a ese mensaje:

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

Si ves cdn.unicyclist.com en ese HTML, eso lo confirma.

Soluciona esa encuesta específica

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

Luego rehaz la vista previa de ese mensaje también:

Post.find(POST_ID).rebake!

Si funciona, corrige en bloque todas las opciones de las encuestas

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

Por qué posts:remap no ayudó

Porque esa tarea rake es para el contenido de los mensajes, mientras que tus referencias de imágenes rotas probablemente están almacenadas en la caché del HTML de las opciones de la encuesta:

Recomendación

  1. Prueba con una encuesta rota
  2. Confirma que las imágenes carguen
  3. Solo entonces ejecuta la corrección en bloque

Si quieres, puedo escribirte un script para copiar y pegar donde solo tengas que reemplazar POST_ID y ejecutarlo de forma segura en una sola encuesta primero.

¿Te parece bien? Obviamente haré una copia de seguridad primero, pero prefiero evitar tener que restaurar mi foro.

Necesito conservar todos los resultados de las encuestas :slight_smile:

Pregunta adicional: ¿Debería Discourse manejar estos casos de forma nativa?