إضافات Discourse وإعدادات config/initializers لـ Rails 6

الآن أصبح الأمر منطقيًا جدًا. لم أواجه أي مشاكل لأنني كنت أقوم بإعادة تشغيل الخادم حتى عند العمل على نواة Discourse بدلاً من إعادة تحميل الكود.

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

ما فعلته مؤخرًا، وأنا لست خبيرًا فائقًا مثل الكثيرين منكم في بناء تطبيقات Rails، هو التخطيط للمتغيرات التي يجب إعادة تحميلها دون إعادة تشغيل Rails، ثم نقل هذا الكود إلى ApplicationController.

أنا متأكد من وجود طرق أفضل للقيام بذلك، ولكن نظرًا لأن تطبيق Rails هذا محددًا هو تطبيق خلفي (back-office) ولا تشكل الأداء مشكلة:

class ApplicationController < ActionController::Base

  before_action  :set_site_settings

  private

  def set_site_settings
    @use_custom_date_format = Sitesetting.where(name: "custom_date_format").pluck(:value).last
  end

end

سأكون سعيدًا عندما أجد طريقة أفضل للقيام بذلك!

ومع ذلك، فإن نقل هذا الكود خارج مُهيئات Rails يعني أن المستخدم يمكنه تغيير إعداد الموقع بسهولة لأنه موجود الآن في قاعدة البيانات باستخدام هيكل CRUD الأساسي في Rails MVC.

بما أن التخزين المؤقت لـ SQL في Rails لا يعمل خارج نطاق الإجراء (action)، فسيكون عليّ يومًا ما أن أتعلم كيفية نقل هذا إلى التخزين المؤقت والتأكد من مسح التخزين المؤقت عندما يعالج وحدة التحكم في Rails الإجراء (على سبيل المثال، حفظ قيمة جديدة في وحدة تحكم إعدادات الموقع، وما إلى ذلك).

على أي حال، فإن تطبيق Rails الخاص بهذا العميل (خلفي فقط) ليس للاستخدام عالي الأداء، لذا فإن إضافة الاستعلام إلى وحدة التحكم في التطبيق يعمل بشكل جيد ويوفر عليّ تكرار هذا الكود في كل وحدة تحكم في المشروع حيث يُطلب إعداد الموقع هذا.

إعجابَين (2)

مرحبًا @fzngagan، أنا بالتأكيد لستُ “خبيرًا في Ruby” ولديّ خبرة أقل بكثير مع Rails مقارنة بمعظم مطوري إضافات ديسكورش؛ ولكن مع ذلك: ربما يمكنك الاعتماد على شيء مشابه لهذا في المستقبل إذا احتجت إلى إعادة تحميل الملفات في إضافتك دون إعادة تشغيل التطبيق في بيئة الإنتاج (أو التطوير):

after_initialize do

  # غيّر السطر التالي إلى المتحكم الذي تفضّله
  # أو استخدم متحكم التطبيق إذا لزم الأمر

  ApplicationController.class_eval do
    before_action :do_my_stuff

    def do_my_stuff
      load File.open(FAIZAANS_FAV_FILE)
    end
  end
end

هذا سيعيد تحميل الملفات كما هو متوقّع.

أنا أستخدم هذا حاليًا في إضافة على النحو التالي، ويعمل كما هو متوقّع:

after_initialize do

  Admin::AdminController.class_eval do
    before_action :do_neo_plugin_info

    def do_neo_plugin_info
      load File.open(PLUGIN_LOGIC)
    end
  end
end

أستخدم هذا الكود حاليًا في إضافة أعمل عليها بين الحين والآخر، وهي تعرض أسماء الحاويات التي يتم تحليلها من ENV["DATA_NAME"]، بالإضافة إلى مساحة القرص التي يتم تحليلها من خلال بعض أكواد النظام باستخدام df وgrep.

في عروض الإدارة لدينا:

كما ذُكر، لستُ خبيرًا في Ruby بأي حال من الأحوال؛ لكن هذه الطريقة تعمل بالنسبة لي.

نظرتُ إلى كود الإضافة في instance.rb، وبعد بعض المحاولات والأخطاء المختلفة، قررتُ الاعتماد على كود class_eval المذكور أعلاه، وقد لا يكون هذا هو الطريقة المفضّلة للقيام بالأشياء، لكنه بالتأكيد يعمل بالنسبة لي.

على سبيل المثال، إذا قمتُ بإعادة تحميل الصفحة بعد حذف العديد من نسخ احتياطي ديسكورش، فإن مؤشر مساحة القرص يتغيّر كما هو متوقّع.