Domanda

Nell'ambiente di sviluppo rotaie, cache_classes è spento in modo da poter modificare il codice sotto app/ e vedere i cambiamenti senza riavviare il server.

In tutti gli ambienti, però, il middleware è creato solo una volta. Quindi, se ho middleware in questo modo:

class MyMiddleware

  def initialize(app)
    @app = app
  end

  def call(env)
    env['model'] = MyModel.first
  end

end

e faccio questo in config/environments/development.rb:

config.cache_classes = false # the default for development
config.middleware.use MyMiddleware

allora io sarò sempre ottenere il seguente errore:

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'
  ...

Il problema è che l'istanza MyMiddleware viene creata una volta al momento del caricamento del sistema, ma la classe MyModel viene ricaricato a ogni chiamata.

Ho cercato di ritardare 'MyModel'.constantize.first vincolante alla classe fino a quando il metodo-call-tempo, ma che cambia il problema ad uno nuovo:

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'
  ...
È stato utile?

Soluzione

Questo sembra essere un bug Rails. Vedere se è possibile aggiornare la versione di Rails a 2.3.4 o 2.3.5.

questo è il commit che ha risolto il problema. bug report originale è qui .

Altri suggerimenti

Si è verificato un problema simile al tuo qualche tempo fa. Per quanto mi ricordo questo potrebbe porre rimedio impostando time_zone in environment.rb a: UTC. Era qualche tempo fa e non ricordo esattamente il nome del parametro di configurazione o se era 'UTC' o: UTC. Fare un tentativo, forse ti aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top