Почему Rails не обновляет классы при каждом запросе (несмотря на конфигурацию)? - PullRequest
14 голосов
/ 11 октября 2011

Недавно я начал перезапускать свой сервер разработки каждый раз, когда я меняю свой код. В моем файле development.rb все еще есть эта строка:

config.cache_classes = false

Я попытался с помощью отладчика убедиться, что это значение застряло. Для этого я установил в моей конфигурации глобальную переменную environment.rb:

$my_initializer = Rails::Initializer.run do |config|
  ...
end

затем я вставил строку debugger в один из моих контроллеров, чтобы я мог сделать это:

(rdb:2) $my_initializer.configuration.cache_classes
false

Так что это исключило возможность того, что значение cache_classes было установлено на true где-то еще. Я пытался использовать Mongrel и WEBrick, и это все еще происходит.

Что еще может заставить Rails не перезагружать мой код при каждом запросе?

Я бегу: Дворняга 1.1.5
WEBrick 1.3.1
Рельсы 2.3.8
Рубин 1.8.7 p253

EDIT: по предложению @Daemin я проверил, что mtime моих файлов действительно обновляются, когда я сохраняю их в своем текстовом редакторе (Textmate)

merced:controllers lance$ ls -l people_controller.rb 
-rwxr-xr-x  1 lance  staff  2153 Act 10 18:01 people_controller.rb

Затем я внес изменения и сохранил файл:

merced:controllers lance$ ls -l people_controller.rb 
-rwxr-xr-x@ 1 lance  staff  2163 Oct 11 12:03 people_controller.rb

Так что это не проблема с mtimes.

Ответы [ 5 ]

11 голосов
/ 20 октября 2011

Получается, что config.threadsafe! перезаписывает эффект config.cache_classes = false, даже если на самом деле он не перезаписывает значение cache_classes (см. Мой вопрос для доказательства).Копаться в исходном коде Rails немного больше может объяснить, почему это так, но на самом деле мне не нужно поточно-ориентированное поведение в моей среде разработки.Вместо этого я заменил свой вызов на config.threadsafe! в environment.rb на

config.threadsafe! unless RAILS_ENV == "development"

, и теперь все работает нормально.

7 голосов
/ 28 августа 2014

Если у кого-то еще есть эта проблема, решение было заказом: config.threadsafe! должен предшествовать config.cache_classes. Измените порядок следующим образом:

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

ответ от: Rails: cache_classes => ложные кэши статических данных

5 голосов
/ 20 октября 2011

Я подозреваю, что классы, которые вы ожидаете обновить, были "необходимы" где-то в вашей конфигурации.Обратите внимание, что загрузка зависимостей в Rails происходит после того, как в Ruby произошли require s.Если определенный модуль или класс уже был необходим, он не будет обработан загрузчиком зависимостей Rails и, следовательно, не будет перезагружен.Для подробного объяснения, проверьте эту статью: http://spacevatican.org/2008/9/28/required-or-not

2 голосов
/ 25 октября 2011

Несмотря на то, что потокобезопасен! решение работает, я также хотел бы указать на вашу пользу и на другие, которые могут прийти после следующего ...

Если вы редактируете код движка, который находится непосредственно в вашем каталоге vendor / engine, эти файлы не будут обновляться без перезапуска. Может быть опция конфигурации, чтобы включить такую ​​функциональность. Тем не менее, это очень важно помнить, если вы использовали механизмы для отделения больших функциональных возможностей от вашего приложения.

0 голосов
/ 11 октября 2011

Полагаю, это не перезагружает классы для каждого запроса, потому что они не менялись между запросами.Таким образом, система записывает время последнего изменения, когда классы загружаются, и не перезагружает их, пока это не изменилось.

...