Настройка
В моем драгоценном камне есть базовый класс Компонентов:
module Component
class Base
def self.inherited(component_class)
Component.class_eval do
define_method(component_class.to_s.underscore) do |*args, &block|
component_class.new(*args, &block)
end
end
end
end
end
Для каждого класса, унаследованного от этого базового класса (например, FancyComponent < Component::Base
), в модуле Component должен быть определен помощник (например, fancy_component
).
Это работает для любых компонентов, поставляемых с моим драгоценным камнем, т.е. Component.instance_methods.include? :fancy_component #=> true
Теперь Rails вступает в игру
Я хочу, чтобы пользователи моего драгоценного камня могли добавлять компоненты. Они хранятся в app/components
.
Эта папка включена во все следующие элементы:
- MyApp :: Application.config.load_paths
- MyApp :: Application.config.autoload_paths
- MyApp :: Application.config.eager_load_paths
Новый компонент UserComponent < Component::Base
хранится в app/components/user_component.rb
.
Проблема
Если я запускаю консоль рельсов, ситуация выглядит следующим образом:
Loading development environment (Rails 3.0.4, ruby-1.9.2-p0)
Component.instance_methods.include? :fancy_component #=> true
Component.instance_methods.include? :user_component #=> false
UserComponent #=> UserComponent
Component.instance_methods.include? :user_component #=> true
Таким образом, вспомогательный метод недоступен, пока не получен доступ к классу компонента.
Итак, как принудительно выполнить загрузку этого класса для выполнения наследуемого?