Rails не запускается инициализатор Railtie
Я разрабатываю гем для использования в приложении на 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
затем определяется. Я посмотрел на несколько плагинов rails и обучающих программ по raltie, и все они говорят, что нужно просто добавить драгоценный камень в ваш Gemfile, и все должно работать. Кто-нибудь может определить, что я делаю не так?
1 ответ
Я понял это почти сразу после публикации. Моё сокровище зовут my-gem
, но имя файла модуля my_gem.rb
, В Gemfile моего хост-приложения есть строка gem my-gem
, но на самом деле загрузить драгоценный камень мне нужно require 'my_gem'
, Итак, чтобы исправить это, мне нужно заменить эту строку в Gemfile хост-приложения на gem my-gem, require: "my_gem"
(или исправьте эту запутанную и случайную схему именования:).