我正在开发一个用于 Rails 4 应用程序的 gem,其中包含一些要作为主机应用程序的初始化程序运行的代码。我正在使用 将一个类添加到模块中const_set
,但该代码实际上并未运行。此外,当我将 gem 放入应用程序的 Gemfile 并启动 rails 控制台或服务器时,我希望从 gem 定义的类不是。如果我require 'my_gem'
从控制台执行一个plain,那么我期望定义的那些类最终会被定义,并且如果我手动运行初始化代码,则不会引发错误。我知道我一定错过了一些非常微不足道的东西,但我不知道那是什么。
这里是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
将我的 gem 放入我的应用程序的 Gemfile 并启动控制台后,MyGem
模块已定义,但MyGem::MyClass
未定义。此外,据我所知,我的 gem 中没有任何初始化代码运行过(由于没有定义类,它会失败)。当 I require 'mygem'
, thenMyGem::MyClass
被定义。我查看了许多 rails 插件和 railtie 教程,他们都说只需将 gem 添加到您的 Gemfile 中,一切都应该正常工作。谁能发现我做错了什么?