Pergunta

No ambiente de desenvolvimento trilhos, cache_classes está fora para que você possa modificar o código sob app/ e ver as mudanças sem reiniciar o servidor.

Em todos os ambientes, porém, middleware só é criado uma vez. Então, se eu tenho middleware como esta:

class MyMiddleware

  def initialize(app)
    @app = app
  end

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

end

e faço isso em config/environments/development.rb:

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

então eu vou sempre obter o seguinte erro:

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

O problema é que a instância MyMiddleware é criada uma vez em tempo de carga do sistema, mas a classe MyModel é recarregado em cada chamada.

Eu tentei 'MyModel'.constantize.first ao atraso de ligação à classe até método call-tempo, mas que muda o problema a um novo:

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'
  ...
Foi útil?

Solução

Este parece ser um bug Rails. Veja se você pode atualizar sua versão Rails a 2.3.4 ou 2.3.5.

Eu acredito este é a confirmação de que corrigiu o problema. relatório de bug original é aqui .

Outras dicas

Nós encontrou um problema semelhante ao seu há algum tempo. Tanto quanto eu me lembro isso poderia ser evitado através da criação time_zone em environment.rb para: UTC. Foi um tempo atrás e eu não me lembro exatamente o nome do parâmetro de configuração ou se foi 'UTC' ou: UTC. Dê-lhe uma tentativa, talvez ele vai ajudar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top