Cela ne permettra pas à Discourse de télécharger ces images afin que vous les ayez lorsqu’elles ne seront plus disponibles sur Photobucket, mais cela les affichera.
Vous voudriez alors aller dans Rails, récupérer tous les messages qui contiennent ^https://hosting.photobucket.com, et faire un gsub pour remplacer ces URL brutes par .
Attendez. Quand j’ai écrit ceci la première fois, l’URL du haut ne s’affichait pas, mais plus tard, il semble que Discourse ait réussi à la télécharger ! (Et cela a également fonctionné sur mon serveur de test !)
Peut-être avez-vous juste besoin de refaire la cuisson des messages ?
Donc, vous vouliez vraiment les corriger lorsque vous avez effectué la migration, mais il est toujours possible d’exécuter une tâche dans Rails qui les corrigerait.
Je dois exécuter une commande Rails pour trouver toutes ces publications et ensuite utiliser gsub pour remplacer les [URL…][/URL] par juste l’URL réelle afin qu’elle s’affiche dans une one-box.
DiscourseHelper :
Recherche
Recherche : Comment utiliser une commande Rails ou un code de console pour trouver toutes les publications contenant un format de chaîne spécifique comme les balises [URL] et ensuite remplacer ces balises par juste l'URL contenue dans Discourse ?
Pour trouver toutes les occurrences de [URL]...[/URL] et les remplacer par uniquement l’URL contenue dans vos publications Discourse, vous pouvez y parvenir en utilisant Rails dans la console Discourse. Voici comment procéder :
Étapes :
Accéder à la console Rails :
Vous avez besoin d’un accès SSH à votre serveur. Exécutez la commande suivante pour accéder à la console Rails de Discourse :
cd /var/discourse
./launcher enter app
rails c
Exécuter une commande de recherche et remplacement :
Utilisez le fragment de code suivant pour localiser les publications contenant [URL]...[/URL] et les remplacer.
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 "Publication mise à jour id : #{post.id}"
end
end
Tester le script :
Avant de remplacer le contenu en masse, exécutez la logique gsub sur une seule publication pour vous assurer qu’elle se comporte comme prévu.
test_post = Post.first # Remplacez par un ID pour un meilleur test
puts test_post.cooked.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
Exécuter le script et surveiller :
Exécutez le script complet, surveillez la sortie et corrigez toute erreur si nécessaire.
Notes :
Ce script utilise des expressions régulières (\[URL=.*?\\](.*?)\\[\\/URL\\]) pour faire correspondre et remplacer le motif spécifié. Assurez-vous que le motif correspond exactement à vos besoins.
Il utilise PostRevisor pour garantir que les modifications sont enregistrées dans l’historique des modifications de la publication.
Assurez-vous de tester minutieusement et de sauvegarder votre base de données avant d’exécuter des modifications en masse.
Pour obtenir des conseils supplémentaires, consultez la documentation connexe sur meta.discourse.org. Si vous rencontrez des problèmes, n’hésitez pas à partager les détails ici !
pfaffman :
Il faut les remplacer dans raw, pas dans cooked.
DiscourseHelper :
Merci pour la clarification ! Puisque les modifications doivent être apportées au champ raw (contenu original de la publication), nous pouvons modifier le script pour qu’il fonctionne avec le champ raw à la place. Voici comment vous pouvez y parvenir :
Commande Rails mise à jour pour le champ raw
Modifier et exécuter le script :
Voici le script mis à jour pour traiter et remplacer les balises [URL]...[/URL] dans le champ raw des publications :
# Trouver toutes les publications dont le champ raw inclut la balise [URL]
Post.where("raw LIKE ?", "%[URL=%[/URL]%").find_each do |post|
updated_raw = post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
if updated_raw != post.raw
# Mettre à jour le contenu raw
post.update!(raw: updated_raw, cooked: nil)
# Déclencher le rebaking pour régénérer le contenu cooked
post.rebake!
puts "Publication mise à jour id : #{post.id}"
end
end
Explication des changements :
raw au lieu de cooked : Le champ raw contient le contenu original de la publication, donc l’opération gsub est appliquée au texte raw.
Réinitialisation de cooked : La définition de cooked à nil garantit que la publication sera correctement rebakée (traitée).
rebake! : Cela déclenche le processus de rebaking, qui régénère la version cooked (rendue en HTML) de la publication à partir du contenu raw mis à jour.
Tester le Gsub pour le contenu Raw :
Testez la substitution d’expression régulière sur une seule publication pour vous assurer qu’elle se comporte correctement :
test_post = Post.first # Remplacez par un ID de publication approprié pour le test
puts test_post.raw.gsub(/\[URL=.*?\](.*?)\[\/URL\]/, '\1')
Exécuter la mise à jour en masse :
Une fois que vous avez confirmé que cela fonctionne comme prévu, vous pouvez exécuter le script pour traiter toutes les publications contenant les balises [URL].
Surveiller et vérifier :
Surveillez la sortie du script. Pour chaque publication mise à jour, son id sera affiché dans la console. Une fois terminé, vérifiez quelques publications sur le site pour vous assurer que les modifications apparaissent correctement.
Rappel de sauvegarde :
Avant d’exécuter le script, assurez-vous d’avoir une sauvegarde complète de la base de données, en particulier lorsque vous travaillez avec des mises à jour en masse.
Si vous avez des questions supplémentaires ou si vous rencontrez des problèmes, n’hésitez pas à demander !
Et j’aime le fait qu’il utilise PostRevisor pour que si quelque chose se passe mal, vous ayez un enregistrement de la modification.
Vous voudrez certainement le tester sur quelques publications avant de le déployer - et aussi voir combien de publications il va corriger et qui recevra des notifications pour toutes ces publications (il y a quelque chose comme bypass_bump ou similaire qui évite les notifications, je pense).