Я разрабатываю драгоценный камень для использования в приложении Rails 4, который включает в себя немного кода для запуска в качестве инициализатора для хост-приложения. Я добавляю класс в модуль с const_set
, но этот код на самом деле никогда не запускается. Кроме того, когда я помещаю драгоценный камень в Gemfile моего приложения и запускаю консоль или сервер rails, классы, которые, как я ожидаю, будут определены из драгоценного камня, не будут. Если я выполню простой require 'my_gem'
из консоли, то те классы, которые, как я ожидаю, будут определены, будут окончательно определены, и если я запущу код инициализации вручную, никаких ошибок не возникнет. Я знаю, что должен упустить что-то действительно тривиальное, но я не могу понять, что это такое.
Вот mygem/lib/mygem.rb
:
require "mygem/railtie" if defined?(Rails)
require "mygem/version"
module MyGem
class MyClass
def self.my_method(argument1, argument2, argument3)
argument1 == argument2 + argument3
end
end
end
Вот mygem/lib/mygem/railtie.rb
:
module MyGem
class Railtie < Rails::Railtie
initializer "mygem.define_subclass" do
PreviouslyDefinedAppModule.const_set "MyClass", MyGem::MyClass
end
end
end
После помещения моего драгоценного камня в Gemfile моего приложения и запуска консоли модуль MyGem
определен, но MyGem::MyClass
не определен. Кроме того, насколько я могу судить, код инициализатора из моего драгоценного камня никогда не запускается (это приведет к сбою, поскольку класс не был определен). Когда я require 'mygem'
, тогда определяется MyGem::MyClass
. Я просмотрел ряд плагинов для рельсов и руководств по рельсам, и все они говорят, что нужно просто добавить драгоценный камень в свой Gemfile, и все должно работать. Может ли кто-нибудь определить, что я делаю неправильно?