Пока вы находитесь в режиме разработки, вы должны указывать Rails не кэшировать ваши классы, чтобы они каждый раз перезагружались. Это означает, что при каждом запросе классы в основном переопределяются в интерпретаторе rails. Настройка в вашем Rails.root / config / environment / development.rb:
config.cache_classes = false
Классы в вашем lib / dir обычно загружаются через инициализатор и не подпадают под этот параметр.
Когда вы перейдете в производство, вы захотите, чтобы все ваши классы кэшировались, чтобы запросы выполнялись быстрее, а rails будут оптимизировать такие вещи, как области видимости в ваших моделях.
Вы можете поместить что-то в другой инициализатор (например, Rails.root / config / initializers / development_reload.rb), который перезагружает каталог lib при каждом запросе в разработке (или только тех, над которыми вы работаете):
# file development_reload.rb
if Rails.env.development?
ActionDispatch::Callbacks.after do
load 'filename_in_lib'
# or
Dir.entries("#{Rails.root}/lib").each do |entry|
load entry if entry =~ /.rb$/
end
end
end
Я вызываю «load», чтобы он фактически перезагружал файл, тогда как «require» просто проверял, был ли он загружен, и определял, что он уже есть, поэтому он не перезагружал его. (Я просто собрал все это вместе и не использую его, но Ruby чрезвычайно гибок и позволит вам сделать совсем немного.) Используйте что-то подобное мудро и только в среде разработчиков.
Почему код необходимо перезагрузить в Rails 3?
Ruby - это интерпретируемый язык (JRuby имеет некоторую поддержку для предварительной компиляции, но он все еще интерпретируется). Интерпретация определения классов после инициализации аналогична компиляции php и развертыванию в исполняемом формате (в некоторой степени). Переводчику не приходится постоянно переопределять классы.
Принудительная перезагрузка является оптимизацией для этого типа интерпретируемого языка. (если вы компилируете AOT в php, вам потребуется перезагрузить скомпилированный «байт-код» и после изменений; php по умолчанию использует компиляцию «на лету», чем вы и пользуетесь)