Инициализатор 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. Я просмотрел ряд плагинов для рельсов и руководств по рельсам, и все они говорят, что нужно просто добавить драгоценный камень в свой Gemfile, и все должно работать. Может ли кто-нибудь определить, что я делаю неправильно?


person 732    schedule 18.08.2014    source источник


Ответы (1)


Я понял это почти сразу после того, как написал. Имя моего драгоценного камня — my-gem, но имя файла модуля — my_gem.rb. В Gemfile моего хост-приложения у меня есть строка gem my-gem, но для фактической загрузки драгоценного камня мне нужно require 'my_gem'. Итак, чтобы исправить это, мне нужно заменить эту строку в Gemfile хост-приложения на gem my-gem, require: "my_gem" (или исправить эту запутанную и бессистемную схему именования :).

person 732    schedule 18.08.2014
comment
Большое спасибо. Это определенно удобно. - person 732; 19.08.2014