كيف يمكنني استخدام كائنات المجال من الوسيطة مع Cache_classes Off؟

StackOverflow https://stackoverflow.com/questions/991113

  •  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'
  ...
هل كانت مفيدة؟

المحلول

يبدو أن هذا هو علة القضبان. معرفة ما إذا كان يمكنك ترقية إصدار القضبان الخاص بك إلى 2.3.4 أو 2.3.5.

أعتقد هذه هو الالتزام الذي تم إصلاح المشكلة. تقرير الأخطاء الأصلي هو هنا.

نصائح أخرى

واجهنا مشكلة مماثلة لك منذ بعض الوقت. بقدر ما أتذكر أن هذا يمكن علاجه عن طريق تحديد TIME_ZONE في البيئة.rb إلى: UTC. لقد كان منذ فترة ولا أتذكر بالضبط اسم المعلمة التكوين أو ما إذا كان "UTC" أو: UTC. اعطيه محاولة، ربما ستساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top