Это сложно объяснить. У меня есть модуль в другом пространстве имен модулей, например:
# app/models/points/calculator.rb
module Points
module Calculator
def self.included(base)
base.send(:include, CommonMethods)
base.send(:include, "Points::Calculator::#{base}Methods".constantize)
end
end
end
Итак, тогда в других классах мне нужно всего лишь:
class User
include Points::Calculator
end
Я установил этот каталог в application.rb для автозагрузки... (хотя я думаю, что рельсы рекурсируют через модели...)
config.autoload_paths += Dir[ Rails.root.join('app', 'models', "points") ]
В разработке env все работает нормально. При выполнении тестов (и создания env) я получаю следующую ошибку:
Unable to autoload constant Points::Calculator, expected /Users/pete/work/recognize/app/models/points/calculator.rb to define it (LoadError)
Я действительно последовал рекомендациям здесь, чтобы устранить проблему: Остановить рельсы при выгрузке модуля в режиме разработки, явно требуя calculator.rb в application.rb.
Однако почему это происходит?
Я запустил некоторый отладочный вывод в файле dependents.rb ActiveSupport и заметил, что этот файл требуется дважды. В первый раз, когда это необходимо, я вижу, что константа действительно загружена.
Но во второй раз требуемая константа была выгружена до тех пор, пока Rails может сказать, но когда вызывается фактическое требование, ruby возвращает false, потому что Ruby знает, что его уже потребовал. Затем Rails выдает ошибку "невозможно автонастраивать константу", потому что константа все еще отсутствует, а ruby не "повторно требует" файл.
Может ли кто-нибудь пролить свет на то, почему это может произойти?