Question

Pour une raison quelconque, j'ai commencé à obtenir cette erreur après le passage à Rails 3.2. Je suppose que cela a quelque chose à voir avec le plugin ACL9, que j'ai essayé de réinstaller, mais rien n'a changé.

J'ai déplacé les plugins vers Lib / Plugins et ajouté l'initialiseur sur config / initialisers mais encore une fois, même erreur.

J'ai cherché une solution sur ACL9 Repo sur GitHub, mais je n'ai rien trouvé là-bas. Peut-être que ce n'est pas ACL9 après tout.

J'ai l'installation de Paperclip, 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'

Edit (résolu): Il a fallu un certain temps pour comprendre et je ne sais toujours pas ce qui s'est passé. Je pense que cela a à voir avec le support d'ACL9 pour Rails 3.1+, mais à la fin, j'ai pris le code ACL9 de GitHub et tout a soudainement commencé à fonctionner.

Était-ce utile?

La solution

Je suis un débutant pour ROR et j'ai obtenu la même erreur tout en parcourant ROR "Getter Starte Guide".

Cela peut sembler idiot, mais d'autres peuvent faire la même erreur que moi, alors publiant ce que j'ai remarqué à Ror dans les yeux du débutant,

validates :name,  : presence => true

Remarque ": présence", ce devrait être ": présence". Maintenant, le rail lance une erreur de syntaxe

 C:/blog/app/models/post.rb:4: syntax error, unexpected ':', expecting keyword_end
 validates :name,  : presence => true

Mais si vous "actualisez" votre navigateur, il masque l'erreur de syntaxe, donne plutôt

undefined method `key?' for nil:NilClass

Il semble que la mise en cache des rails soit le coupable. :)

Autres conseils

Ce n'est peut-être pas votre problème car il semble que vous aviez déjà du code de travail pour commencer, mais pour une référence future pour d'autres, j'ai rencontré la même erreur en raison d'une simple faute de frappe à l'intérieur de mon code de modèle, comme ainsi:

class Foo < ActiveRecord::Base
    validates :content, :length => { maximum => 10 }
end

Ce qui aurait dû être:

class Foo < ActiveRecord::Base
    validates :content, :length => { :maximum => 10 }
end

Remarquez le "maximum" vs ": maximum" - cela a entraîné l'erreur exacte ci-dessus et je suis parti lorsque j'ai corrigé cette faute de frappe.

Je ne sais pas si c'est le même bug, mais j'avais un problème similaire. Sur un premier chargement d'un modèle de buggy, Des rails répond par un Erreur de routage Et puis pour les demandes à venir par la suite, il répond avec undefined method 'key?' for nil:NilClass et la même trace de pile.

Cela semble être un bug avec Cache de classe de rails, mais peut se déplacer en activant la mise en cache de classe ou en désactivant le rechargement de classe de changement.

config.cache_classes = true

ou

config.cache_classes = false
config.reload_classes_only_on_change = false

Je suis d'accord avec BMOOSKAU que vous devriez vérifier votre code de modèle pour les bogues. À ma grande surprise, les modèles sont apparemment parfois chargés pendant le routage phase. J'ai découvert:

  1. Le code qui provoque le problème, dans mon cas, est dans le modèle, pas dans le contrôleur où je m'y attendais.
  2. La undefined method `key?' for nil:NilClass L'erreur ne se produit souvent qu'après la première fois que j'accéderai à la page.

Pour autant que je sache, ce qui se passe

  1. Supposons que nous ayons un échafaudage pour des exemples, avec un mauvais code dans app/models/example.rb
  2. Une demande est faite pour /examples
  3. La partie de routage des rails correspond à cela app/controllers/examples_controller.rb Mais ça première charges app/models/example.rb. Je ne sais pas pourquoi il charge le modèle, mais l'effet est que je conjecture: l'erreur dans le modèle arrête une partie de la partie du code de routage, corrompant sa construction d'un cache de routes.
  4. À ce stade, si j'ai de la chance, l'erreur me sera rapportée dans le navigateur. Parfois, cependant, je reçois simplement un message disant No route matches [GET] "/examples" (Pour être juste pour les rails, cette complication supplémentaire semble être la faute de ne pas utiliser resources :examples pour faire l'itinéraire. Ce qui suit se produit malgré tout).
  5. Une deuxième demande est faite pour /examples
  6. Conjecture: cette fois, le code de routage des rails essaie d'utiliser sa référence en cache à app/controllers/examples_controller.rb Mais le cache des routes est corrompu (une variable est nil) Parce que le code qui définit n'a jamais fini en cours d'exécution.

Ce dernier élément est le plus ennuyeux car le problème qui l'a causé (le mauvais code dans le modèle) n'est même pas exécuté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top