14

最近、コードを変更するたびに開発サーバーを再起動しなければならなくなりました。私の development.rb ファイルにはまだ次の行があります。

config.cache_classes = false

デバッガーを使用して、この値が固定されていることを確認してみました。これを行うには、環境設定を environment.rb のグローバル変数に設定します。

$my_initializer = Rails::Initializer.run do |config|
  ...
終わり

debugger次に、コントローラーの1つに行を入れて、これを実行できるようにしました。

(rdb:2) $my_initializer.configuration.cache_classes
間違い

cache_classesそのため、 の値が別の場所に設定される可能性がなくなりましたtrue。Mongrel と WEBrick の両方を使用してみましたが、まだ発生します。

Rails がすべてのリクエストで私のコードをリロードしない原因として、他に何が考えられるでしょうか?

私は実行しています: Mongrel 1.1.5
WEBrick 1.3.1
Rails 2.3.8
Ruby 1.8.7 p253

EDIT:@Daeminの提案で、ファイルをテキストエディター(Textmate)に保存すると、ファイルのmtimeが実際に更新されていることを確認しました

merced:controllers lance$ ls -l people_controller.rb
-rwxr-xr-x 1 ランス スタッフ 2153 Act 10 18:01 people_controller.rb

次に、変更を加えてファイルを保存しました。

merced:controllers lance$ ls -l people_controller.rb
-rwxr-xr-x@ 1 ランス スタッフ 2163 10 月 11 日 12:03 people_controller.rb

したがって、mtimes の問題ではありません。

4

5 に答える 5

11

したがって、実際には のを上書きしませんが、config.threadsafe!の効果を上書きすることがわかります (証明については私の質問を参照してください)。Rails のソース コードをもう少し調べてみると、その理由が明らかになるかもしれませんが、私の開発環境では実際にはスレッドセーフな動作は必要ありません。代わりに、environment.rbの呼び出しを次のように置き換えました。config.cache_classes = falsecache_classesconfig.threadsafe!

config.threadsafe! RAILS_ENV == "開発" でない限り

そして、すべてが正常に動作するようになりました。

于 2011-10-20T19:32:19.007 に答える
7

他の誰かがこの問題を抱えている場合、解決策は順序でした: config.threadsafe!has to come before config.cache_classes. 次のように並べ替えて修正します。

...
config.threadsafe!
config.cache_classes = false
...

回答: Rails: cache_classes => false まだキャッシュしています

于 2014-08-28T18:45:53.253 に答える
5

あなたが更新しようとしているクラスは、構成のどこかで「必要」になっていると思われます。Rails の依存関係の読み込みは、Ruby の依存関係の読み込みの後に行われることに注意してくださいrequire。特定のモジュールまたはクラスがすでに必要な場合、Rails の依存関係ローダーによって処理されないため、再読み込みされません。詳細な説明については、次の記事をご覧ください: http://spacevatican.org/2008/9/28/required-or-not

于 2011-10-20T06:40:24.250 に答える
2

スレッドセーフという事実にもかかわらず!解決策はうまくいきます、私はまたあなたの利益と次の後に来るかもしれない他のもののために指摘したいと思いました...

ベンダー/エンジンディレクトリに直接あるエンジンコードを編集している場合、それらのファイルは再起動しないと更新されません。このような機能を有効にするための構成オプションがある場合があります。ただし、これは、エンジンを使用してアプリケーションから機能の大部分を分離した場合に覚えておくことが非常に重要です。

于 2011-10-25T18:30:50.520 に答える
0

私の推測では、リクエスト間でクラスが変更されていないため、リクエストごとにクラスをリロードしていないと思います。そのため、システムはクラスがロードされたときに最後に変更された時刻を記録し、それが変更されるまで再ロードしません。

于 2011-10-11T00:48:07.970 に答える