إذا كانت إضافة Discourse تحتوي على مجلد يُسمى “config” ومجلد فرعي تحت “config” يُسمى “initializers”، فهل تقوم تطبيق Rails الخاص بـ Discourse بقراءة جميع ملفات التهيئة الخاصة بالإضافة الموجودة تحت مجلد “initializers” تمامًا كما يفعل Rails 6؟
السبب في سؤالي هو أنني بصدد كتابة تطبيق Rails 6 من نوع “المكتب الخلفي” (Rails فقط، بدون EmberJS أو أي إطار عمل JavaScript آخر) من الصفر لعميل، ولدي مجلد تحت initializers على النحو التالي:
./config/initializers/client/
… وجميع ملفات التهيئة الفريدة الخاصة بالعميل موجودة في المجلد الفرعي “client”.
Rails 6 يقرأ جميع الملفات الموجودة تحت مجلد التهيئة القياسي (حتى المجلدات الفرعية)، لذا تساءلتُ عما إذا كانت إضافات Discourse، مع بنية مجلدات مماثلة للتهيئات، ستعمل مثل Rails 6 وتقرأ جميع ملفات التهيئة في الإضافة على النحو التالي:
ملاحظة: لقد تفحصتُ حوالي 10 إضافات لـ Discourse على GitHub، ولم يكن لأي منها ملفات تهيئة تحت مجلد config. وهذا هو السبب في أنني قررتُ طرح السؤال (وبيئة تطوير Rails الخاصة بي غير مُعدة حاليًا لـ Discourse، فهي مُعدة بالكامل للعميل).
بعد التصفح السريع في هذه الصفحة Ruby on Rails Guides: Configuring Rails Applications
أعتقد أن ملف plugin.rb هو إلى حد كبير نفس الشيء. فمعظم الإضافات التي حجمها لائق تستخدمه كنقطة دخول للمنطق بدلاً من أن يكون هو المنطق نفسه.
نعم، لقد قرأت دليل Rails هذا كثيرًا مؤخرًا. بشكل عام، أنا “مُرضٍ” من طريقة عمل إعدادات Rails 6 (ما زلت أتعلم، لكنني أصبح أكثر راحة كل يوم).
أنا أتساءل فقط عما إذا كان بإمكاننا استخدام نفس البنية في إضافة Discourse (للمُهيئات)، وهل سيقوم Rails بقراءة المُهيئات في المجلدات الفرعية كما يفعل في Rails 6؛ أم أننا مضطرون لتسجيل مجلد مُهيئات الإضافة كـ “أصل” إعدادات (لعدم وجود كلمة أفضل) في ملف plugin.rb.
كنت أقرأ عن إضافات Rails أمس وقارنتها أيضًا قليلاً.
نعم، لا توجد مشكلة في استدعاء وتحميل مهيئات التهيئة في ملف plugin.rb.
كان سبب سؤالي هو أنني أكتب حاليًا تطبيقًا كبيرًا نسبيًا مبنيًا على Rails 6 لأحد الشركات، لتحويل نصوصهم القديمة الخاصة بالمكتب الخلفي (التي تمتد على عدة عقود) إلى تطبيق Rails. ولإضافة مهيئات التهيئة، أنشأت مجرد مجلد فرعي تحت config/initializers (في Rails)، وتتم إدراج جميع ملفات المهيئات الخاصة بي بشكل أنيق دون الحاجة إلى كتابة أي كود لإدراج هذه الملفات في Rails.
لا يجب أن تضطر إلى استخدام reloadable_patch لكل شيء. العديد من الطرق المحددة في instance.rb لتسهيل تطوير الإضافات تستخدم reloadable_patch داخليًا، مثل add_to_serializer.
من الناحية المثالية، يجب أن تكون واجهة برمجة تطبيقات الإضافة لدينا جيدة لدرجة أنك لن تضطر إلى القيام بكمية هائلة من استخدام reloadable_patch.
نعم، هذا صحيح. أتساءل عما إذا كان يمكن فعل أي شيء بشأن تغييرات ملفات yml؛ فهذا الأمر يزعجني شخصيًا.
صحيح ذلك. لم أكن أعرف أن reloadable_patch مخصص لدعم إعادة التحميل المباشر. يمكنني التفكير في العديد من حالات الاستخدام بخلاف تلك التي يستخدمها Discourse بالفعل، أي:
بدأت في استكشاف إعادة التحميل المباشر للتغييرات في ملفات YAML، وهو ما يعمل بالفعل. قد تؤدي الإضافات إلى تعطيل هذه الميزة إذا لم تستخدم reloadable_patch بشكل صحيح، ولكن بمجرد أن تتمكن جميع الإضافات الخاصة بك من إعادة التحميل بأمان، ستعمل التغييرات في ملفات YAML أيضًا.
هذا يصف خاصية أساسية في Rails، وهي غير ذات صلة مباشرة بـ Discourse.
في Rails، يتم تحميل جميع المهيئات (initializers) فقط عند بدء تشغيل Rails، لذا فإن أي إضافة (plugin) تنفذ كودًا بناءً على المهيئات، مثل “after_initializer”، ستنفذ فقط عند بدء تشغيل Rails أو إعادة تشغيله (أرجو تصحيحي إذا كنت مخطئًا).
السبب في معرفتي بهذا هو أنني أقوم حاليًا ببناء تطبيق Rails لعميل، وقد كتبت العديد من المهيئات لمهام مختلفة (قيم منطقية، مصفوفات ثابتة، إلخ). في كل حالة، إذا قمنا بتغيير أي كود في مهيئ Rails، فإننا نحتاج إلى إعادة تشغيل Rails (“Control c، ثم rails s في وضع التطوير”) لتطبيق القيم الجديدة في المهيئات داخل تطبيق Rails.
أرجو تصحيحي إذا كنت مخطئًا! شكرًا لك.
في بعض الأحيان، أعتقد أن هذا قد يكون مربكًا قليلاً لبعض مطوري إضافات Discourse، خاصة أولئك الذين يعملون بشكل أساسي على إضافات Discourse وليس مع تطبيقات Rails بشكل عام، عندما نكتب “Discourse يفعل هذا” أو “Discourse يفعل ذلك” بينما ما نصفه حقًا هو وظيفة أو خاصية أساسية في Rails وليست بالضرورة مرتبطة بـ Discourse بحد ذاتها.
Rails 6 يقرأ جميع الملفات الموجودة في مجلد config/initializers (وكل المجلدات الفرعية داخل config/initializers) فقط عند بدء تشغيل Rails. وبالمثل (لست متأكدًا بنسبة 100% بشأن الإضافات)، فإن إضافة Discourse التي تحتوي على كود يعتمد على after_initialize سيتم تحميلها بواسطة تطبيق Rails فقط عند بدء تشغيل Rails أو إعادة تشغيله، لأن هذه خاصية أساسية لعملية بدء تشغيل Rails.
تخميني هو أن الجميع هنا يعرفون هذا بالفعل من يعملون على Rails. أنا فقط بدأت أعرف هذه التفاصيل (وأشعر أن لدي طريقًا طويلًا لأصبح خبيرًا)؛ لأنني أعمل حاليًا على تطبيق Rails يوميًا (في هذه الأيام)، والذي بالمناسبة، أتمنى الآن أن أبدأ العمل مع Rails قبل عقد من الزمان، لأنه قادمًا من خلفية تطوير LAMP، أجد Rails أفضل بكثير (سهلة وممتعة للعمل معها).
أصبحت معجبًا كبيرًا بـ Rails هذا العام، وأنا ممتن جدًا لـ Discourse لكونها نقطة البداية في هذا المسار.
مرة أخرى، أرجو تصحيحي إذا كنت مخطئًا! شكرًا لك. أنا أحاول أن أصبح أكثر خبرة في Rails.