Подтвердить что ты не робот

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

Мне недавно пришло в голову перезапустить сервер разработки каждый раз, когда я меняю свой код. Мой файл 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
Rails 2.3.8
Ruby 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 
[email protected] 1 lance  staff  2163 Oct 11 12:03 people_controller.rb

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

4b9b3361

Ответ 1

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

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

ответ от: Rails: cache_classes = > ложные кэширования

Ответ 2

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

config.threadsafe! unless RAILS_ENV == "development"

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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