Обновите URL-адреса в опросе после изменения CDN

Я создал опрос на своём форуме следующим образом:

[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), и URLs изменились с cdn.unicyclist.com на unicyclist.com.

Однако ссылки на изображения в опросе по-прежнему ведут в никуда, хотя при предварительном просмотре поста они отображаются корректно:

Перепечать (rebake) постов и запуск команды rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' не помогли.

На ask.discourse.org рекомендуют:

Что, вероятно, происходит

Варианты вашего опроса хранятся не только в исходном тексте поста. В схеме вашего сайта опросы также сохраняют отрендеренный HTML-код вариантов в:

  • polls
  • poll_options.html

Поэтому предварительный просмотр поста может выглядеть нормально, но рендерер опроса всё ещё использует устаревший HTML со старым именем хоста CDN.

Связанные документы:

Важное предупреждение

Сначала сделайте полную резервную копию.

Также избегайте «простого редактирования» опроса, если в нём уже есть голоса, так как обычно редактирование опроса сбрасывает все голоса:

Более безопасный подход: сначала проверьте один сломанный опрос

В контейнере:

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)

Если вы увидите cdn.unicyclist.com в этом HTML, это подтвердит теорию.

Исправьте один опрос

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. протестируйте на одном сломанном опросе
  2. убедитесь, что изображения загружаются
  3. только после этого запускайте массовое исправление

Если хотите, я могу написать для вас скрипт для копирования и вставки, где вам нужно будет заменить только POST_ID и безопасно запустить его сначала на одном опросе.

Выглядит ли это разумно? Я, конечно же, сначала сделаю резервную копию, но я предпочитаю избегать необходимости восстанавливать форум из бэкапа.

Мне нужно сохранить все результаты опросов :slight_smile:

Бонусный вопрос: не должна ли Discourse нативно обрабатывать такие случаи?