كيف يمكنني استخدام كائنات المجال من الوسيطة مع Cache_classes Off؟
-
13-09-2019 - |
سؤال
في بيئة تطوير القضبان، cache_classes
مطفأ حتى تتمكن من تعديل الرمز تحت app/
وشاهد التغييرات دون إعادة تشغيل الخادم.
في جميع البيئات، رغم ذلك، يتم إنشاء الوسيطة مرة واحدة فقط. لذلك إذا كان لدي برامج متوسطة مثل هذا:
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
env['model'] = MyModel.first
end
end
وأفعل هذا في config/environments/development.rb
:
config.cache_classes = false # the default for development
config.middleware.use MyMiddleware
ثم سأحصل دائما على الخطأ التالي:
A copy of MyMiddleware has been removed from the module tree but is still active!
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:414:in `load_missing_constant'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:96:in `const_missing'
/Users/me/projects/my_project/lib/my_middleware.rb:8:in `call'
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/middleware_stack.rb:72:in `new'
...
المشكلة هي أن MyMiddleware
تم إنشاء مثيل مرة واحدة في وقت تحميل النظام، ولكن MyModel
يتم إعادة تحميل الفئة على كل مكالمة.
حاولت 'MyModel'.constantize.first
لتأخير ملزمة للفئة حتى وقت المكالمة، ولكن هذا يغير المشكلة إلى واحدة جديدة:
You have a nil object when you didn't expect it!
The error occurred while evaluating nil.include?
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/active_record/attribute_methods.rb:142in `create_time_zone_conversion_attribute?'
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/active_record/attribute_methods.rb:75:in `define_attributes_methods'
...
نصائح أخرى
واجهنا مشكلة مماثلة لك منذ بعض الوقت. بقدر ما أتذكر أن هذا يمكن علاجه عن طريق تحديد TIME_ZONE في البيئة.rb إلى: UTC. لقد كان منذ فترة ولا أتذكر بالضبط اسم المعلمة التكوين أو ما إذا كان "UTC" أو: UTC. اعطيه محاولة، ربما ستساعد.