どのように私はオフcache_classesとミドルウェアからドメインオブジェクトを使用していますか?

StackOverflow https://stackoverflow.com/questions/991113

  •  13-09-2019
  •  | 
  •  

質問

レールの開発環境では、cache_classesはそうあなたがapp/下のコードを変更し、サーバーを再起動せずに変更を見ることができますオフになっています。

は、すべての環境では、しかし、ミドルウェアは、一度だけ作成されます。だから私はこのようなミドルウェアを持っている場合:

class MyMiddleware

  def initialize(app)
    @app = app
  end

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

end

と私はconfig/environments/development.rbで次の操作を行います。

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

私は常に、次のエラーが発生します

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

問題がMyMiddlewareインスタンスがシステム負荷の時に一度作成されていることですが、MyModelクラスは呼び出しごとに再ロードされます。

私は、メソッド呼び出し時まで、クラスへの結合を遅らせるように'MyModel'.constantize.firstを試してみましたが、それは新しいものに問題を変更します:

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'
  ...
役に立ちましたか?

解決

これはRailsのバグのように見えます。あなたは2.3.4または2.3.5へのあなたのRailsのバージョンをアップグレードすることができます参照してください。

私はこのには、問題を修正し、そのコミットであると考えています。オリジナルバグレポートはこちらのです。

他のヒント

私たちはいくつかの時間前にあなたに似た問題が発生しました。 UTC:私の知る限り、これを覚えているようにenvironment.rbにでTIME_ZONEを設定することによって改善することができます。これは、しばらく前だったと私は正確にconfigパラメータの名前を覚えていないか、それが「UTC」かあったかどうか:UTC。それを試してみる、多分それはお手伝いします。

scroll top