لماذا يتسبب استدعاء super في PostSerializer#raw بحدوث خطأ 500 بينما يعمل استدعاء object.raw؟

مرحباً بالجميع،

أنا أتعلم كيفية توسيع مُسلسِلات (serializers) ديسكورس (Discourse)، وواجهت سلوكًا لا أفهمه تمامًا.

أضفت هذا الكود لتجاوز PostSerializer#raw:

require_dependency "post_serializer"

class ::PostSerializer
  def raw
    if scope.can_edit?(object)
      object.raw
    else
      object.raw&.truncate(300)
    end
  end
end

هذا يعمل بشكل مثالي.

ولكن، إذا قمت بتغييره لاستخدام super:

require_dependency "post_serializer"

class ::PostSerializer
  def raw
    if scope.can_edit?(object)
      super
    else
      object.raw&.truncate(300)
    end
  end
end

عندما تكون scope.can_edit?(object) صحيحة، فإن الاستدعاء إلى super يتسبب في إرجاع /posts/:id.json خطأ 500.

أعلم أنه يمكنني تجنب المشكلة باستخدام object.raw بدلاً من super، ولكني أريد أن أفهم لماذا يتسبب super في حدوث استثناء هنا، خاصة وأنني أقوم بتجاوز طرق أخرى (مثل cooked و post_stream، إلخ) ويعمل super بشكل جيد في تلك الحالات.

بما أنني ما زلت جديدًا على الأجزاء الداخلية لديسكورس، سأكون ممتنًا جدًا للحصول على شرح حول:

  • ما الذي يحل محله super بالضبط داخل PostSerializer#raw،
  • لماذا يؤدي استدعاء super في هذه الحالة إلى خطأ 500،
  • ولماذا يتصرف raw بشكل مختلف مقارنة بالطرق مثل cooked.

شكرًا مقدمًا على أي مساعدة!

أنا متأكد من أن السبب هو أن raw ليس موجودًا في مُسلسِل (serializer) المنشور العادي. يتم تضمينه فقط عند تعديل المنشور. لعرض منشور، تحتاج فقط إلى cooked؛ سيكون من غير المجدي تضمين raw أيضًا عندما لا يكون مطلوبًا.

يتم تضمين cooked و post_stream في المُسلسِل، لذا يعمل super.