تعديل مصفّف الفئة يتصرف بشكل مختلف في الإصدار 2.4.0

بعد الترقية إلى https://github.com/discourse/discourse/releases/tag/v2.4.0.beta2، واجهت معظم الإضافات لدينا (مثل معاينات قائمة المواضيع، والأحداث، والمواقع، والتقييمات، إلخ) مشكلة في طريقة add_to_serializer في ملف plugin.rb.

كان الاستخدام السابق يتبع هذا التنسيق:

add_to_serializer(:serializer, property) { value }

لم يعد هذا يعمل في بيئة الإنتاج. لكنه لا يزال يعمل في بيئة التطوير.

في البداية، ظننت أن المشكلة قد تكون مرتبطة بطريقة تمكين الإضافات. حيث أن طريقة _include? في add_to_serializer تستخدم حالة enabled?:

if define_include_method
   # Don't include serialized methods if the plugin is disabled
  klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end

ومع ذلك، يبدو أن استخدام نظام enabled_site_setting لا يحل المشكلة. علاوة على ذلك، يبدو أن enabled? لا تزال تعود بالقيمة الافتراضية true على أي حال:

def enabled?
  @enabled_site_setting ? SiteSetting.get(@enabled_site_setting) : true
end

لحل المشكلة المباشرة، قمنا بتغيير طريقة تسلسل البيانات في إضافاتنا، لكنني أود فهم السبب الجذري إن أمكن. هل لدى أحدكم أي أفكار حول ما يحدث هنا؟

cc @merefield, @fzngagan

هذا أمر غير معتاد للغاية، حيث أننا نستخدمه في الاستطلاعات، وهي بالتأكيد ليست معطلة. الشيء الوحيد الذي يمكنني التفكير فيه هو أنها كانت معطلة في إصدار بيتا، ولكن تم إصلاحها في الفرع الرئيسي. هل يمكنك تجربتها على tests-passed ومعرفة ما إذا كانت تعمل؟

سأختبره أكثر اليوم. الاستخدام في الاستطلاعات يختلف قليلاً، حيث يُسبق دائماً طريقة _include? بمعامل ثالث false. أشك في أن طريقة include? قد تكون هي المشكلة.

add_to_serializer(:post, :polls_votes, false)

يبدو أن هذه المشكلة محددة بتعديلات مُسلسلات الفئات.

https://staging.discourse.angusmcleod.com.au يحتوي على إضافة واحدة مثبتة وهي “test-add-to-serializer”

كما ترون في ملف plugin.rb، تم إجراء عدد من التعديلات على المُسلسلات.

يبدو أن التعديلات على المُسلسلات غير الخاصة بالفئات تعمل بشكل صحيح، لكن التعديلات على مُسلسل basic_category تعمل فقط في بيئة التطوير.

لن تجد خصائص الفئة الاختبارية في:

https://staging.discourse.angusmcleod.com.au/categories.json

أو

https://staging.discourse.angusmcleod.com.au/c/records-musicians.json

لكن ستجد خصائص الاختبار الأخرى في:

https://staging.discourse.angusmcleod.com.au/t/this-is-a-title-of-a-topic/42.json

أو

https://staging.discourse.angusmcleod.com.au/latest.json

إذًا، يبدو أن المشكلة لا تتعلق بطريقة add_to_serializer بحد ذاتها، بل بتعديل مُسلسل basic_category.

@j.jaffeux @dan مرحبًا :), يبدو أنكم قمتم بعمل حديث على discourse-voting لمعالجة نفس المشكلة التي شرحتها أعلاه.

هل تعرفون لماذا لم يعد إضافة خصائص إلى basic_category_serializer كافيًا؟

أستطيع تأكيد أن هذا يؤثر على tests-passed

داني غائب، لكن في الأساس هناك ثلاثة أماكن مختلفة نقوم فيها بتسلسل الفئات مع كميات متفاوتة من البيانات. سنرى ما إذا كان هناك أي طريقة لإزالة المزيج (mixin) هنا، مما يجعل فهم هذا الأمر أكثر صعوبة.

تم الإصلاح وإرجاعه إلى الإصدارات المستقرة والنسخ التجريبية.

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

شكرًا لك يا @sam، نقدر ذلك كثيرًا.

شكرًا لك على الإبلاغ والمثابرة في هذا الأمر، لقد كان من الصعب جدًا تحديد المشكلة، حيث قضيت بعض الوقت في قراءة التفاصيل الداخلية لـ Rails لفهمها.

تأكد من الاطلاع على الاختبار الجديد إذا كنت فضوليًا لمعرفة كيف نضمن أن هذا الأمر سيبقى سليمًا في المستقبل.

شكرًا جزيلاً لك، @sam، على إصلاح هذا بسرعة.

@angus، هل سيستمر عمل إضافة البرنامج لدينا دون التغييرات الأخيرة التي قمنا بها بسبب هذا الإصلاح؟