Как работает кэширование классов в rails 2.2+ - PullRequest
2 голосов
/ 30 марта 2009

У меня есть приложение rails, которое исправляет ActiveRecord с помощью валидатора, закодированного вручную.

Патч сделан путем добавления следующих строк в config / environment.rb

Rails::Initializer.run do |config|  
...    
end  

class ActiveRecord::Base  
  include MtLib::DBValidations  
end  

Это прекрасно работает в производственном режиме, т.е. с

config.cache_classes = true  

однако он не работает в разработке, если для cache_classes установлено значение false.

Выдается ошибка

    ArgumentError (A copy of MtLib::DBValidations has been removed from  
      the module tree but is still active!):

Мой вопрос заключается в том, каков процесс, который используется, когда cache_class имеет значение false. Rails повторно запускает какой-либо из методов инициализации? Если нет, то где мне лучше всего поставить патч, чтобы он был во всех моделях и выдержал перезагрузку классов?

Я попытался добавить исправление в config / initializers / active_record_patch, однако это не перезапускается при перезагрузке классов.

1 Ответ

2 голосов
/ 30 марта 2009

Решение этой проблемы, предоставленное Фредериком Ченгом из группы Google Ruby On Rails, добавляет каталог, содержащий загруженный класс, в массив load_once_path.

Я отредактировал environment.rb, чтобы он выглядел так

 config.load_paths +=  
   %W( #{RAILS_ROOT}/lib/soap_clients/carefone #{RAILS_ROOT}/lib/mt_lib)  

  # Make sure load_once_paths is a subset of load_paths  
  config.load_once_paths +=  %W( #{RAILS_ROOT}/lib/mt_lib)  

И теперь это работает в режиме разработки без перезагрузки сервера при каждом запросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...