الآن أصبح الأمر منطقيًا جدًا. لم أواجه أي مشاكل لأنني كنت أقوم بإعادة تشغيل الخادم حتى عند العمل على نواة Discourse بدلاً من إعادة تحميل الكود.
ما فعلته مؤخرًا، وأنا لست خبيرًا فائقًا مثل الكثيرين منكم في بناء تطبيقات 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 الخاص بهذا العميل (خلفي فقط) ليس للاستخدام عالي الأداء، لذا فإن إضافة الاستعلام إلى وحدة التحكم في التطبيق يعمل بشكل جيد ويوفر عليّ تكرار هذا الكود في كل وحدة تحكم في المشروع حيث يُطلب إعداد الموقع هذا.
مرحبًا @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 المذكور أعلاه، وقد لا يكون هذا هو الطريقة المفضّلة للقيام بالأشياء، لكنه بالتأكيد يعمل بالنسبة لي.
على سبيل المثال، إذا قمتُ بإعادة تحميل الصفحة بعد حذف العديد من نسخ احتياطي ديسكورش، فإن مؤشر مساحة القرص يتغيّر كما هو متوقّع.
