2011-08-08 8 views
0

私は基本的なRailsアプリケーションをテストしていますが、コントローラスクリプトにrequire()されているライブラリスクリプトにいくつかの望ましくないキャッシュ動作が発生しているようです。RubyやRailsのキャッシュにはrequire()されたスクリプトがキャッシュされていますか?

と仮定FooController.rbには、次のものが含まれています

require 'utils' # a library script 

class FooController 
    def some_action 
    @some_member = do_something() # global method defined in utils.rb 
    end 
end 

私がRailsのサーバーを再起動するまでutils.rbへの変更が有効にならないことが表示されます。私はこれがRailsのクラスキャッシングの設定ミスに起因するとは思わない、a)私は "開発"環境で走っている、b)コントローラコードを直接変更することができる(例えば、上記のsome_actionメソッドへ)がスクリプトの次の実行時に反映されます。私はputsへのいくつかの呼び出しでこれをテストしており、コンソールにスパムメッセージを送ります。

require()スクリプトがキャッシュされたままになるようなRubyやRailsの動作はありますか?もしそうなら、その動作を設定する方法はありますか?

+0

これはhttp://stackoverflow.com/questions/3282655/ruby-on-rails-3-reload-lib-directory-for-each-requestと他の非常によく似たいくつかの質問のほぼ同じように見えます。これはエンジンに関するものですが、どちらも '/ lib'で自動的にファイルを読み込んでいます。 – Emily

答えて

1

Railsのクラスリロード機能は比較的ナイーブです。私はそれがコントローラーやモデルのようなものをリロードすることを意図しているだけだと思っています。したがって、libディレクトリや他の場所にカスタムコードがある場合は、Railsサーバーを再起動する必要があります。

+0

特定のスクリプトに対して1行の変更を加え、クラスキャッシングを有効にする必要がある場合、運用環境ではどうなりますか?変更を有効にするためにサーバーを再起動する必要があるのでしょうか、それとも何らかのホットスワップが必要ですか? –

+0

Rubyは動的なので、メソッドやクラスを即座に置き換えることができますが、アプリケーションを再起動するのも非常に簡単です。通常、Rackサーバーには、完全再起動(tmp/restart.txtファイルに触れるなど)を行わずにアプリケーションを再ロードする方法がありますが、単一のファイルだけでなくすべてを再ロードします。 – coreyward

+0

また、gemのアクティブリロードhttps://github.com/paneq/active_reloadもあります。私はそれを使用していないし、このシナリオで役立つかどうかはわかりません。 – rubish

1

loadがコードになるたびにrequireにしたい場合は、本当に必要です。

http://www.ruby-doc.org/core/Kernel.html#method-i-load

+0

興味深くて便利ですが、ライブラリスクリプトが現在のプロセスに関係するスクリプトの中で複数回参照される可能性があるので、どちらかが必要かどうかはわかりません。私が望むのは、現在のプロセスが参照ファイルの最新バージョンを尊重することです。確かにそれはコンパイルされていない言語を扱う基本的な教えですか? –

関連する問題