Bonjour à tous,
Je rencontre un problème persistant en essayant de suspendre/désactiver en masse des utilisateurs sur mon instance Discourse (version 3.5.0.beta5-dev) via la console Rails. J’essaie d’exclure mon compte administrateur (hoangthai, ID utilisateur 100) et de suspendre définitivement tous les autres utilisateurs actifs non-administrateurs/non-modérateurs avec une raison personnalisée « Chưa gia hạn tài khoản » (Renouvellement de compte en attente).
J’ai essayé plusieurs approches basées sur les commandes courantes de la console Discourse et des suggestions de débogage, mais les comptes restent active: true même si suspended_at et suspended_till peuvent être définis.
Voici une ventilation de ce que j’ai tenté et les erreurs/résultats :
Mon objectif : Suspendre tous les utilisateurs définitivement (sauf hoangthai, ID 100) avec la raison « Chưa gia hạn tài khoản » (Renouvellement de compte en attente).
Tentatives & Problèmes :
-
Première tentative (Définition directe de
suspend_reason,suspended_at,suspended_till) :admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? && !user.admin? && !user.moderator? user.suspend_reason = "Tài khoản tạm khóa do nghỉ phép dài hạn." # Première tentative de raison user.suspended_at = Time.current user.suspended_till = Time.current + 100.years user.save! puts "Khóa tài khoản: #{user.username}" end end- Résultat :
NoMethodError: undefined method 'suspend_reason=' for an instance of User(suggérésuspended_at=). Cela indiquait quesuspend_reasonn’était pas l’attribut correct.
- Résultat :
-
Deuxième tentative (Utilisation de
UserSuspension.suspend_usercomme suggéré pour les versions plus récentes) :admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? && !user.admin? && !user.moderator? UserSuspension.suspend_user( user, Time.current + 100.years, nil, # suspend_reason_id "Tài khoản tạm khóa: Nghỉ phép dài hạn.", # custom_suspend_reason Discourse.system_user ) puts "Đã khóa tài khoản: #{user.username}" end end- Résultat :
NameError: uninitialized constant UserSuspension(suggéréUserSuspender). Cela indiquait que le nom de la classe était incorrect.
- Résultat :
-
Troisième tentative (Nom de classe corrigé en
UserSuspender) :admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? && !user.admin? && !user.moderator? UserSuspender.suspend_user( # J'essaie toujours suspend_user user, Time.current + 100.years, nil, "Tài khoản tạm khóa: Nghỉ phép dài hạn.", Discourse.system_user ) puts "Đã khóa tài khoản: #{user.username}" end end- Résultat :
NoMethodError: undefined method 'suspend_user' for class UserSuspender(suggéréUserSuspended?). Cela a montré que le nom de la méthode était également incorrect.4. Quatrième tentative (Utilisation deUserSuspender.new(...).suspendcomme modèle d’objet de service) :
admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? puts "Đã khóa tài khoản: #{user.username}" rescue => e puts "Lỗi khi khóa tài khoản #{user.username}: #{e.message}" end end end- Résultat : Cette commande s’est exécutée sans erreur dans la console. Elle a affiché « Đã khóa tài khoản: [username] ».
- Cependant, lors de la vérification de l’état de l’utilisateur dans l’interface d’administration ou de l’interrogation directe de
user.activedans la console, les utilisateurs affichaient toujoursactive : true. Seulssuspended_atetsuspended_tillont été mis à jour (par exemple,suspended_at : "2025-05-26 00:37:01.406064419 +0000", suspended_till : nil). Les comptes pouvaient toujours se connecter.
- Résultat :
-
Cinquième tentative (Définition directe de
active = falseavec les champs de suspension) :admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? user.save! puts "Đã **khóa VĨNH VIỄN** và vô hiệu hóa tài khoản: #{user.username}" rescue => e puts "LỖI khi xử lý tài khoản #{user.username}: #{e.message}" end end end- Résultat : Cette commande s’est également exécutée sans erreur et a affiché des messages de succès.
- Cependant, le résultat a été le même :
active : trueest resté, etsuspended_at/suspended_tillont été mis à jour, mais les comptes n’ont pas été réellement désac…