Это не позволит Discourse загрузить эти изображения, поэтому они останутся у вас, даже если они больше не будут доступны на Photobucket, но при этом они будут отображаться.
Так что вам нужно будет зайти в Rails, найти все сообщения, содержащие ^https://hosting.photobucket.com, и выполнить gsub, чтобы заменить эти простые URL на .
Подождите. Когда я писал это в первый раз, верхний URL не отображался, но позже, похоже, Discourse всё же удалось его загрузить! (И это работало на моём тестовом сервере тоже!)
Возможно, вам просто нужно переобработать сообщения?
Если эта функция отключена, включите её, перейдите к созданной мной теме, нажмите на и затем выберите пункт, который переводится как «Перестроить HTML».
Мне нужно выполнить команду Rails, чтобы найти все такие посты, а затем использовать gsub для замены [URL…][/URL] на саму ссылку, чтобы она отображалась в виде одного блока.
DiscourseHelper:
Поиск
Поиск по запросу: Как использовать команду Rails или код консоли для поиска всех постов, содержащих определенный формат строки, например теги [URL], а затем заменить эти теги просто на содержащийся URL в Discourse?
Чтобы найти все вхождения [URL]...[/URL] и заменить их только на содержащийся URL в ваших постах Discourse, вы можете сделать это с помощью Rails в консоли Discourse. Вот как это сделать:
Шаги:
Доступ к консоли Rails:
Вам нужен SSH-доступ к вашему серверу. Выполните следующую команду для доступа к консоли Rails Discourse:
cd /var/discourse
./launcher enter app
rails c
Выполнение команды поиска и замены:
Используйте следующий фрагмент кода для поиска постов, содержащих [URL]...[/URL], и их замены.
Post.where("cooked LIKE ?", "%[URL=%[/URL]%").find_each do |post|
updated_cooked = post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
if updated_cooked != post.cooked
post.update!(cooked: updated_cooked)
PostRevisor.new(post, Discourse.system_user).revise!(
post.user,
{ cooked: updated_cooked },
revised_at: Time.now
)
puts "Updated post id: #{post.id}"
end
end
Тестирование скрипта:
Перед массовой заменой содержимого запустите логику gsub для одного поста, чтобы убедиться, что она работает как ожидалось.
test_post = Post.first # Замените на ID для лучшего тестирования
puts test_post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
Выполнение скрипта и мониторинг:
Запустите полный скрипт, отслеживайте вывод и при необходимости исправляйте ошибки.
Примечания:
Этот скрипт использует регулярное выражение (\[URL=.*?\](.*?)\[\/URL\]) для сопоставления и замены указанного шаблона. Убедитесь, что шаблон точно соответствует вашим требованиям.
Используется PostRevisor, чтобы изменения были зафиксированы в истории редактирования поста.
Обязательно тщательно протестируйте и сделайте резервную копию базы данных перед выполнением любых массовых изменений.
Для дополнительной помощи ознакомьтесь с соответствующей документацией на meta.discourse.org. Если возникнут проблемы, не стесняйтесь делиться деталями здесь!
pfaffman:
Нужно заменить их в поле raw, а не в cooked.
DiscourseHelper:
Спасибо за уточнение! Поскольку изменения нужно внести в поле raw (исходное содержимое поста), мы можем модифицировать скрипт для работы с полем raw. Вот как это сделать:
Обновленная команда Rails для поля raw
Модификация и запуск скрипта:
Ниже приведен обновленный скрипт для обработки и замены тегов [URL]...[/URL] в поле raw постов:
# Найти все посты, где raw содержит тег [URL]
Post.where("raw LIKE ?", "%[URL=%[/URL]%").find_each do |post|
updated_raw = post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
if updated_raw != post.raw
# Обновить содержимое raw
post.update!(raw: updated_raw, cooked: nil)
# Запустить rebake для пересоздания cooked содержимого
post.rebake!
puts "Updated post id: #{post.id}"
end
end
Объяснение изменений:
raw вместо cooked: Поле raw содержит исходное содержимое поста, поэтому операция gsub применяется к тексту raw.
Сброс cooked: Установка cooked в nil гарантирует, что пост будет правильно пересоздан (обработан).
rebake!: Это запускает процесс пересоздания, который генерирует версию поста cooked (HTML-отрендеренную) на основе обновленного содержимого raw.
Тестирование gsub для содержимого raw:
Протестируйте подстановку регулярного выражения для одного поста, чтобы убедиться, что она работает корректно:
test_post = Post.first # Замените на подходящий ID поста для тестирования
puts test_post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
Выполнение массового обновления:
Как только вы подтвердите, что это работает как задумано, вы можете запустить скрипт для обработки всех постов, содержащих теги [URL].
Мониторинг и проверка:
Отслеживайте вывод скрипта. Для каждого обновленного поста его id будет выведен в консоль. После завершения проверьте несколько постов на сайте, чтобы убедиться, что изменения отображаются корректно.
Напоминание о резервном копировании:
Перед запуском скрипта убедитесь, что у вас есть полная резервная копия базы данных, особенно при работе с массовыми обновлениями.
Если у вас есть дополнительные вопросы или возникнут проблемы, не стесняйтесь спрашивать!
И мне нравится, что здесь используется PostRevisor, так что если что-то пойдет не так, у вас будет запись об редактировании.
Вам определенно стоит протестировать это на нескольких постах, прежде чем запускать в работу — а также посмотреть, сколько постов будет исправлено и кто получит уведомления обо всех них (есть что-то вроде bypass_bump или аналогичное, что пропускает уведомления, кажется).