שלום לכולם,
אני מתמודד עם בעיה מתמשכת בניסיון להשעות/לבטל משתמשים רבים בו-זמנית במופע ה-Discourse שלי (גרסה 3.5.0.beta5-dev) דרך קונסולת Rails. אני מנסה לא לכלול את חשבון הניהול שלי (hoangthai, מזהה משתמש 100) ולהשעות לצמיתות את כל שאר המשתמשים הפעילים שאינם מנהלים/מפקחים עם סיבה מותאמת אישית “Chưa gia hạn tài khoản” (חידוש חשבון ממתין).
ניסיתי מספר גישות המבוססות על פקודות קונסולת Discourse נפוצות והצעות לאיתור באגים, אבל החשבונות נשארים active: true למרות שייתכן ש-suspended_at ו-suspended_till מוגדרים.
הנה פירוט של מה שניסיתי והשגיאות/תוצאות:
המטרה שלי: להשעות את כל המשתמשים לצמיתות (מלבד hoangthai, מזהה 100) עם הסיבה “Chưa gia hạn tài khoản” (חידוש חשבון ממתין).
ניסיונות ובעיות:
-
ניסיון ראשוני (הגדרת
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." # ניסיון סיבה ראשון 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- תוצאה:
NoMethodError: undefined method 'suspend_reason=' for an instance of User(הוצעsuspended_at=). זה הצביע על כך ש-suspend_reasonאינו המאפיין הנכון.
- תוצאה:
-
ניסיון שני (שימוש ב-
UserSuspension.suspend_userכפי שהוצע עבור גרסאות חדשות יותר):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- תוצאה:
NameError: uninitialized constant UserSuspension(הוצעUserSuspender). זה הצביע על כך ששם המחלקה שגוי.
- תוצאה:
-
ניסיון שלישי (שם מחלקה תוקן ל-
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( # עדיין מנסה 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- תוצאה:
NoMethodError: undefined method 'suspend_user' for class UserSuspender(הוצעUserSuspended?). זה הראה שגם שם השיטה שגוי.
- תוצאה:
-
ניסיון רביעי (שימוש ב-
UserSuspender.new(...).suspendכתבנית אובייקט שירות):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.", suspended_till: nil # להשעיה קבועה ).suspend 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- תוצאה: פקודה זו רצה ללא שגיאות בקונסולה. היא הדפיסה “Đã khóa tài khoản: [username]”.
- אולם, כשבודקים את סטטוס המשתמש בממשק ניהול או באמצעות שאילתה ישירה של
user.activeבקונסולה, המשתמשים עדיין הראוactive: true. רקsuspended_atו-suspended_tillעודכנו (לדוגמה,suspended_at: "2025-05-26 00:37:01.406064419 +0000", suspended_till: nil). החשבונות עדיין יכלו להתחבר.
-
ניסיון חמישי (הגדרה ישירה של
active = falseיחד עם שדות ההשעיה):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 # קבוע user.custom_suspension_reason = "Chưa gia hạn tài khoản" # סיבה מותאמת אישית user.active = false # חלק מכריע 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- תוצאה: גם פקודה זו רצה ללא שגיאות והדפיסה הודעות הצלחה.
- אולם, התוצאה הייתה זהה:
active: trueנשאר, ו-suspended_at/suspended_tillעודכנו, אבל חשבונות לא עברו דה-אק…