تلعيب Discourse - الحصول على 404 / MissingAttributeError على مسار /leaderboard

لذا، لقد قررتُ مؤخرًا تفعيل التلعيب (gamification) وواجهتُ على الفور مشكلة حيث كان المسار /leaderboard يعيد خطأ 404. كان لدى الخلفية أكثر من 800 ألف سجل نقاط محسوب، وكانت الأذونات صحيحة، لكن الصفحة نفسها لم تكن تُحمّل.

أظهرت مراجعة سجلات الخادم ما يلي:
ActiveModel::MissingAttributeError (missing attribute 'admin' for User)

أثناء التعمق في كود الإضافة، لاحظتُ في ملف lib/discourse_gamification/leaderboard_cached_view.rb أن استعلام المستخدم يستخدم سلسلة .select محددة لسحب الأعمدة الخاصة بجدول المتصدرين:

.select(
"users.id, users.name, users.username, users.uploaded_avatar_id, p.total_score, p.position",
)

وبما أن users.admin و users.moderator غير مدرجين في ذلك الاستعلام، فإن كائنات المستخدمين المُنشأة لا تحتوي على تلك الحقول المتاحة. يبدو أن (?) في مرحلة ما لاحقًا أثناء التسلسل (serialization) أو عرض التخطيط الأساسي، يتم تفعيل فحص الموظفين (staff check) على هؤلاء المستخدمين، مما يتسبب في قيام Rails برمي خطأ MissingAttributeError والعودة إلى صفحة 404.

لقد عدّلتُ ذلك الملف يدويًا لإدراج users.admin و users.moderator في كتلة .select:

.select(
  "users.id, users.name, users.username, users.uploaded_avatar_id, users.admin, users.moderator, p.total_score, p.position",
)

بعد إعادة تشغيل حاوية التطبيق، بدأ جدول المتصدرين في التحميل بشكل مثالي.

أظن أن هذا خطأ (?) أم أنني بالغتُ في التفكير أو أغفلتُ شيئًا تمامًا؟

الموقع حاليًا يعمل على الإصدار v2026.6.0-latest (47a830330f)

إعجابَين (2)

يتطابق الخطأ مع التفسير الذي قدمته. للأسف، لم أتمكن من تكرار المشكلة من 47a830330f أو من الفرع الرئيسي main. جربت الدخول بحساب مدير وبمستخدم عادي، وكلاهما يعملان بشكل صحيح.

كإجراء تحقق منطقي، أود فقط التأكيد على أنك تستخدم إصدار gamification المرفق مع نواة Discourse، ولا يوجد مثبت عليه الإضافة القديمة المستقلة؟

هل يمكنك تقديم المزيد من تتبع المكدس (stack trace) لمكان حدوث خطأ MissingAttributeError؟

إعجاب واحد (1)

@تيد،

في الواقع، يمكنك تجاهل هذا الأمر بحرية. لقد تتبعنا المشكلة في النهاية إلى إضافة ربطت بـ UserScoreSerializer وقامت بتنفيذ عبارة .select() خاصة بها ومحددة للغاية. لم يكن الأمر واضحًا في البداية لأنه لم يُقدَّم أي تتبع للمكدس في /logs لخطأ MissingAttributeError. لم نتمكن من تحديد الإضافة الخاطئة إلا بعد البحث الدقيق وإجراء الاستدعاء يدويًا عبر ريلز للحصول على تتبع كامل للمكدس.

شكرًا لك، ونعتذر عن الإنذار الكاذب!

إعجابَين (2)

لا مشكلة! واجهتُك مشكلة وشاركتها هنا. يسعدني أنك تمكنت من حلها. :slightly_smiling_face: