Chiave del metodo Rails 3.2 undefined?"per nil: NilClass
-
12-11-2019 - |
Domanda
Per qualche motivo ho iniziato a ricevere questo errore dopo il passaggio a Rails 3.2.Immagino che abbia qualcosa a che fare con il plugin acl9, che ho provato a reinstallare, ma non è cambiato nulla.
Ho spostato i plugin su lib / plugins e aggiunto l'inizializzatore a config/initializers ma ancora una volta, lo stesso errore.
Ho cercato la soluzione su acl9 repo su Github, ma non sono riuscito a trovare nulla lì.Forse non è acl9 dopo tutto.
Ho installato 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'
MODIFICA (RISOLTO):Ci è voluto un po ' di tempo per capire e non sono ancora abbastanza sicuro di cosa sia successo.Penso che abbia a che fare con il supporto di acl9 per Rails 3.1+ Ma alla fine ho preso il codice acl9 da github e tutto improvvisamente ha iniziato a funzionare.
Soluzione
Sono un principiante per ror e ho ottenuto lo stesso errore mentre vai attraverso ROR "Guida introduttiva".
Questo può sembrare sciocco, ma altri potrebbero fare lo stesso errore di essere, quindi postare quello che ho notato in ROR da Newbie's Eyes,
validates :name, : presence => true
.
Nota ": presenza", dovrebbe essere ": presenza".Ora la ferrovia lancia un errore di sintassi
C:/blog/app/models/post.rb:4: syntax error, unexpected ':', expecting keyword_end
validates :name, : presence => true
.
Ma se si "aggiorna" il browser, nasconde l'errore di sintassi, invece dà
undefined method `key?' for nil:NilClass
.
Sembra che la cache dei binari sia il colpevole.:)
Altri suggerimenti
Questo potrebbe non essere il tuo problema come sembra che tu abbia già avuto il codice di lavoro per cominciare, ma per riferimento futuro per gli altri, ho corso nello stesso errore a causa di un semplice errore di errore all'interno del mio codice modello, come così:
.class Foo < ActiveRecord::Base
validates :content, :length => { maximum => 10 }
end
.
che avrebbe dovuto essere:
class Foo < ActiveRecord::Base
validates :content, :length => { :maximum => 10 }
end
.
Nota il "massimo" VS. ": massimo" - Ciò ha comportato l'esatto errore NIL sopra, e è andato via quando ho riparato quel tipo di errore.
Non sono sicuro se questo è lo stesso bug, ma stavo avendo un problema simile.Su un primo carico di un modello buggy, Rails risponde con un errore di routing e quindi per le richieste che vengono in seguito rispondono con undefined method 'key?' for nil:NilClass
e la stessa traccia dello stack.
Questo sembra essere un bug con Rails Class Class Caching , ma può spostarsi abilitando la cache di classe o la disattivazione della classe di modifica della classe.
.
config.cache_classes = true
o
.config.cache_classes = false
config.reload_classes_only_on_change = false
Sono d'accordo con bmoeskau che dovresti controllare il codice del tuo modello per i bug.Con mia sorpresa, i modelli apparentemente a volte vengono caricati durante il routing fase.Ho scoperto:
- Il codice che causa il problema, nel mio caso, è nel modello, non nel controller dove me lo aspetterei.
- Il
undefined method `key?' for nil:NilClass
l'errore spesso si verifica solo dopo la prima volta che accedo alla pagina.
Per quanto posso dire, quello che succede è
- Supponiamo di avere uno scaffold per esempi, con un codice errato in
app/models/example.rb
- Una richiesta è fatta per
/examples
- La parte di routing di Rails corrisponde a
app/controllers/examples_controller.rb
ma è prima caricoapp/models/example.rb
.Non capisco perché carica il modello, ma l'effetto è, congettura:L'errore nel modello si ferma breve una parte del codice di routing, corrompendo la sua costruzione di una cache di rotte. - A questo punto, se sono fortunato l'errore mi verrà segnalato nel browser.A volte, tuttavia, ricevo semplicemente un messaggio che dice
No route matches [GET] "/examples"
(Per essere onesti con Rails, questa complicazione aggiunta sembra essere la colpa di non usareresources :examples
per fare il percorso.Quanto segue accade a prescindere). - Una seconda richiesta è fatta per
/examples
- Congettura:Questa volta il codice di routing Rails tenta di utilizzare il suo riferimento memorizzato nella cache per
app/controllers/examples_controller.rb
ma la cache delle rotte è corrotta (una variabile ènil
) perché il codice che imposta non ha mai finito di funzionare.
Quest'ultimo elemento è più fastidioso perché il problema che lo ha causato (il codice errato nel modello) non viene nemmeno eseguito.