Hallo zusammen,
ich habe ein anhaltendes Problem beim Versuch, Benutzer auf meiner Discourse-Instanz (Version 3.5.0.beta5-dev) per Massenvorgang über die Rails-Konsole zu sperren/deaktivieren. Ich versuche, meinen Admin-Account (hoangthai, Benutzer-ID 100) auszuschließen und alle anderen aktiven Nicht-Admin-/Nicht-Moderator-Benutzer dauerhaft mit einem benutzerdefinierten Grund „Chưa gia hạn tài khoản“ (Kontoerneuerung ausstehend) zu sperren.
Ich habe verschiedene Ansätze ausprobiert, die auf gängigen Discourse-Konsolenbefehlen und Debugging-Vorschlägen basieren, aber die Konten bleiben active: true, obwohl suspended_at und suspended_till gesetzt werden könnten.
Im Folgenden eine Aufschlüsselung meiner Versuche und der Fehler/Ergebnisse:
Mein Ziel: Alle Benutzer dauerhaft sperren (außer hoangthai, ID 100) mit dem Grund „Chưa gia hạn tài khoản“ (Kontoerneuerung ausstehend).
Versuche Probleme:
-
Erster Versuch (Direktes Setzen von
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." # Erster Grundversuch 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- Ergebnis:
NoMethodError: undefined method 'suspend_reason=' for an instance of User(Vorschlagsuspended_at=). Dies deutete darauf hin, dasssuspend_reasonnicht das richtige Attribut war.
- Ergebnis:
-
Zweiter Versuch (Verwendung von
UserSuspension.suspend_user, wie für neuere Versionen vorgeschlagen):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- Ergebnis:
NameError: uninitialized constant UserSuspension(VorschlagUserSuspender). Dies deutete darauf hin, dass der Klassenname falsch war.
- Ergebnis:
-
Dritter Versuch (Korrigierter Klassenname zu
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( # Versuche immer noch 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- Ergebnis:
NoMethodError: undefined method 'suspend_user' for class UserSuspender(VorschlagUserSuspended?). Dies zeigte, dass der Methodenname ebenfalls falsch war.
- Ergebnis:
-
Vierter Versuch (Verwendung von
UserSuspender.new(...).suspendals Service-Object-Muster):admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? && !user.admin? && !user.moderator? begin UserSuspender.new( user, Discourse.system_user, reason: "Tài khoản tạm khóa: Nghỉ phép dài hạn." (Konto vorübergehend gesperrt: Längerer Urlaub), suspended_till: nil # For permanent suspension ).suspend puts "Đã khóa tài khoản: #{user.username}" (Konto gesperrt: #{user.username}) rescue => e puts "Lỗi khi khóa tài khoản #{user.username}: #{e.message}" (Fehler beim Sperren des Kontos #{user.username}: #{e.message}) end end end- Ergebnis: Dieser Befehl wurde ohne Fehler in der Konsole ausgeführt. Er gab „Đã khóa tài khoản: [username]“ aus (Konto gesperrt: [Benutzername]).
- Beim Überprüfen des Benutzerstatus in der Admin-UI oder beim direkten Abfragen von
user.activein der Konsole zeigten die Benutzer jedoch immer nochactive: truean. Nursuspended_atundsuspended_tillwurden aktualisiert (z. B.suspended_at: "2025-05-26 00:37:01.406064419 +0000", suspended_till: nil). Die Konten konnten sich weiterhin anmelden.
-
Fünfter Versuch (Direktes Setzen von
active = falsezusammen mit den Sperrfeldern):admin_id_to_exclude = 100 User.where.not(id: admin_id_to_exclude).each do |user| if user.active? && !user.admin? && !user.moderator? begin user.suspended_at = Time.current user.suspended_till = nil # Permanent user.custom_suspension_reason = "Chưa gia hạn tài khoản" (Konto nicht verlängert) user.active = false # Crucial part user.save! puts "Đã **khóa VĨNH VIỄN** và vô hiệu hóa tài khoản: #{user.username}" (Konto **PERMANENT** gesperrt und deaktiviert: #{user.username}) rescue => e puts "LỖI khi xử lý tài khoản #{user.username}: #{e.message}" (FEHLER bei der Verarbeitung des Kontos #{user.username}: #{e.message}) end end end- Ergebnis: Auch dieser Befehl wurde ohne Fehler ausgeführt und gab Erfolgsmeldungen aus.
- Das Ergebnis war jedoch das gleiche:
active: trueblieb bestehen, undsuspended_at/suspended_tillwurden aktualisiert, aber die Konten wurden nicht tatsächlich deak…