Я создал опрос на своём форуме следующим образом:
[poll name=freestyle type=multiple results=always min=1 max=14 public=true chartType=bar]
* **#1** 
* **#2** 
[/poll]
Я переехал с CDN на обычное хостинг-решение (без CDN), и URLs изменились с cdn.unicyclist.com на unicyclist.com.
Однако ссылки на изображения в опросе по-прежнему ведут в никуда, хотя при предварительном просмотре поста они отображаются корректно:
Перепечать (rebake) постов и запуск команды rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' не помогли.
На ask.discourse.org рекомендуют:
Что, вероятно, происходит
Варианты вашего опроса хранятся не только в исходном тексте поста. В схеме вашего сайта опросы также сохраняют отрендеренный HTML-код вариантов в:
pollspoll_options.htmlПоэтому предварительный просмотр поста может выглядеть нормально, но рендерер опроса всё ещё использует устаревший HTML со старым именем хоста CDN.
Связанные документы:
- Создание и управление опросами
- Удаление DISCOURSE_CDN_URL
- Отключение CDN приводит к тому, что старые изображения с URL 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-кода вариантов опроса:
Рекомендация
- протестируйте на одном сломанном опросе
- убедитесь, что изображения загружаются
- только после этого запускайте массовое исправление
Если хотите, я могу написать для вас скрипт для копирования и вставки, где вам нужно будет заменить только
POST_IDи безопасно запустить его сначала на одном опросе.
Выглядит ли это разумно? Я, конечно же, сначала сделаю резервную копию, но я предпочитаю избегать необходимости восстанавливать форум из бэкапа.
Мне нужно сохранить все результаты опросов ![]()
Бонусный вопрос: не должна ли Discourse нативно обрабатывать такие случаи?
