我正在开发一个用于Rails 4应用程序的gem,其中包含一些作为主机应用程序初始化器运行的代码。我将一个类添加到一个模块与const_set
,但该代码从来没有实际运行。此外,当我把gem放在我的应用程序的Gemfile中并启动rails控制台或服务器时,我期望从gem定义的类不会。如果我从控制台上执行普通的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
将我的gem放入我的应用程序的Gemfile并启动控制台后,MyGem
模块被定义,但MyGem::MyClass
没有定义。此外,据我所知,我的gem中的初始化器代码从未运行过(它会失败,因为没有定义类)。当I = require 'mygem'
时,则定义了MyGem::MyClass
。我看了很多rails插件和rails教程,他们都说只要把gem添加到你的Gemfile中,一切都应该正常工作。有人能指出我做错了什么吗?
我发帖后几乎立刻就明白了。我的gem名称是my-gem
,但模块的文件名是my_gem.rb
。在我的主机应用程序的Gemfile中,我有gem my-gem
行,但要实际加载gem,我需要require 'my_gem'
。所以,为了解决这个问题,我需要用gem my-gem, require: "my_gem"
替换主机应用程序的Gemfile中的那行(或修复这个令人困惑和随意的命名方案:)。