我正在开发一个用于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中没有初始化代码可以运行(因为没有定义类,它会失败)。当我require 'mygem'
时,则会定义MyGem::MyClass
。我已经看了很多rails插件和railstie教程,他们都说只是将gem添加到你的Gemfile中,一切都应该正常工作。谁能发现我做错了什么?
答案 0 :(得分:1)
我发布后几乎立刻就知道了。我的宝石名称是my-gem
,但模块的文件名是my_gem.rb
。在我的主机应用程序的Gemfile中,我有一行gem my-gem
,但要实际加载我需要require 'my_gem'
的宝石。所以,为了解决这个问题,我需要用gem my-gem, require: "my_gem"
替换主机应用程序的Gemfile中的那一行(或修复这个令人困惑和偶然的命名方案:)。