سؤال

لسبب ما، بدأت أتلقى هذا الخطأ بعد التبديل إلى Rails 3.2.أعتقد أن الأمر يتعلق بالمكون الإضافي acl9، والذي حاولت إعادة تثبيته، لكن لم يتغير شيء.

لقد قمت بنقل المكونات الإضافية إلى lib/plugins وأضفت مُهيئًا إلى config/initializers ولكن مرة أخرى، نفس الخطأ.

لقد بحثت عن الحل في acl9 repo على Github، لكن لم أجد أي شيء هناك.ربما ليس ACL9 على كل حال.

لقد قمت بتثبيت مشبك الورق، ACL9، Authlogic.

NoMethodError (undefined method `key?' for nil:NilClass):
actionpack (3.2.1) lib/action_controller/metal/hide_actions.rb:36:in `visible_action?'
actionpack (3.2.1) lib/action_controller/metal/hide_actions.rb:18:in `method_for_action'
actionpack (3.2.1) lib/action_controller/metal/implicit_render.rb:14:in `method_for_action'
actionpack (3.2.1) lib/action_controller/metal/compatibility.rb:61:in `method_for_action'
actionpack (3.2.1) lib/abstract_controller/base.rb:115:in `process'
actionpack (3.2.1) lib/abstract_controller/rendering.rb:45:in `process'
actionpack (3.2.1) lib/action_controller/metal.rb:203:in `dispatch'
actionpack (3.2.1) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
actionpack (3.2.1) lib/action_controller/metal.rb:246:in `block in action'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:66:in `call'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:66:in `dispatch'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:30:in `call'
journey (1.0.3) lib/journey/router.rb:68:in `block in call'
journey (1.0.3) lib/journey/router.rb:56:in `each'
journey (1.0.3) lib/journey/router.rb:56:in `call'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:589:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
rack (1.4.1) lib/rack/etag.rb:23:in `call'
rack (1.4.1) lib/rack/conditionalget.rb:25:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/head.rb:14:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/flash.rb:242:in `call'
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context'
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/cookies.rb:338:in `call'
activerecord (3.2.1) lib/active_record/query_cache.rb:64:in `call'
activerecord (3.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:443:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (3.2.1) lib/active_support/callbacks.rb:405:in `_run__3140920687338355213__call__3168118505970967148__callbacks'
activesupport (3.2.1) lib/active_support/callbacks.rb:405:in `__run_callback'
activesupport (3.2.1) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
activesupport (3.2.1) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (3.2.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/reloader.rb:65:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
railties (3.2.1) lib/rails/rack/logger.rb:26:in `call_app'
railties (3.2.1) lib/rails/rack/logger.rb:16:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/request_id.rb:22:in `call'
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
rack (1.4.1) lib/rack/runtime.rb:17:in `call'
activesupport (3.2.1) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.4.1) lib/rack/lock.rb:15:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/static.rb:53:in `call'
railties (3.2.1) lib/rails/engine.rb:479:in `call'
railties (3.2.1) lib/rails/application.rb:220:in `call'
rack (1.4.1) lib/rack/content_length.rb:14:in `call'
railties (3.2.1) lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

تحرير (تم الحل):لقد استغرق الأمر بعض الوقت لمعرفة ذلك وما زلت غير متأكد تمامًا مما حدث.أعتقد أن الأمر يتعلق بدعم acl9 لـ Rails 3.1+ ولكن في النهاية أخذت كود acl9 من github وبدأ كل شيء في العمل فجأة.

هل كانت مفيدة؟

المحلول

أنا مبتدئ إلى ROR وحصلت على نفس الخطأ أثناء المرور عبر ROR "Getting Report".

قد يبدو هذا سخيفا، لكن البعض الآخر قد يرسل نفس الخطأ كما أنا، لذلك نشر ما لاحظته في Ror من عيون مبتدئ، giveacodicetagpre.

ملاحظة ": وجود"، يجب أن يكون ": وجود".الآن يلقي السكك الحديدية خطأ في بناء الجملة giveacodicetagpre.

ولكن إذا قمت بتحديث "المتصفح الخاص بك، فإنه يخفي خطأ بناء الجملة، بدلا من ذلك يعطي giveacodicetagpre.

يبدو التخزين المؤقت القضبان هو الجاني.:)

نصائح أخرى

قد لا يكون هذا مشكلتك لأنه يبدو وكأنه كان لديك بالفعل رمز عمل للبدء، ولكن للإشارة المستقبلية للآخرين، ركضت نفس الخطأ بسبب خطأ مطبعي بسيط داخل رمز النموذج الخاص بي، مثل ذلك:

giveacodicetagpre.

الذي كان ينبغي أن يكون: giveacodicetagpre.

لاحظ "الحد الأقصى" مقابل ": الحد الأقصى" - هذا نتج عن خطأ NIL بالضبط أعلاه، وذهبت عندما أصلصت تلك الخطأ المطبعية.

لست متأكدا إذا كان هذا هو نفس الخطأ ولكن كنت أعاني من مشكلة مشابهة.على أول شحنة من عربات التي تجرها الدواب النموذج ، القضبان يستجيب مع التوجيه خطأ ثم للطلبات القادمة بعد ذلك يستجيب مع undefined method 'key?' for nil:NilClass ونفس تتبع المكدس.

هذا يبدو أن يكون الخلل مع القضبان فئة التخزين المؤقت, ولكن يمكن الحصول على جميع أنحاء من خلال تمكين فئة التخزين المؤقت أو تعطيل على تغيير الطبقة إعادة شحن.

config.cache_classes = true

أو

config.cache_classes = false
config.reload_classes_only_on_change = false

أتفق مع bmoeskau أنه يجب عليك التحقق من رمز النموذج الخاص بك بحثًا عن الأخطاء.لدهشتي، يبدو أن النماذج يتم تحميلها أحيانًا أثناء التوجيه مرحلة.اكتشفت:

  1. الكود الذي يسبب المشكلة، في حالتي، موجود في النموذج، وليس في وحدة التحكم حيث أتوقعه.
  2. ال undefined method `key?' for nil:NilClass غالبًا ما يحدث الخطأ فقط بعد أول مرة أقوم فيها بالوصول إلى الصفحة.

بقدر ما أستطيع أن أقول، ما يحدث هو

  1. لنفترض أن لدينا سقالة للأمثلة، مع بعض التعليمات البرمجية السيئة في app/models/example.rb
  2. يتم تقديم طلب ل /examples
  3. يتطابق جزء التوجيه في Rails مع ذلك app/controllers/examples_controller.rb لكنه أولاً الأحمال app/models/example.rb.لا أعرف سبب تحميل النموذج، ولكن أعتقد أن التأثير هو:يؤدي الخطأ في النموذج إلى إيقاف جزء من رمز التوجيه، مما يؤدي إلى إتلاف إنشاء ذاكرة التخزين المؤقت للمسارات.
  4. في هذه المرحلة، إذا كنت محظوظًا، فسيتم إبلاغي بالخطأ مرة أخرى في المتصفح.ومع ذلك، في بعض الأحيان، أتلقى ببساطة رسالة تقول No route matches [GET] "/examples" (لكي نكون منصفين لريلز، يبدو أن هذا التعقيد الإضافي هو خطأ عدم الاستخدام resources :examples لجعل الطريق.يحدث ما يلي بغض النظر).
  5. تم تقديم طلب ثاني ل /examples
  6. تخمين:هذه المرة، يحاول كود توجيه Rails استخدام مرجعه المخزن مؤقتًا app/controllers/examples_controller.rb لكن ذاكرة التخزين المؤقت للطرق تالفة (المتغير هو nil) لأن التعليمات البرمجية التي تم تعيينها لم تنتهي من التشغيل مطلقًا.

هذا العنصر الأخير هو الأكثر إزعاجًا لأن المشكلة التي تسببت فيه (الكود السيئ في النموذج) لم يتم تشغيلها.

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