我正在开发一个在Rails4应用程序中使用的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中,一切都会正常工作。有人能发现我做错了什么吗?
发布于 2014-08-19 05:16:46
在我发帖后,我几乎立刻就弄明白了。我的gem名称是my-gem,但是模块的文件名是my_gem.rb。在我的主机应用程序的Gemfile中,我有行gem my-gem,但要实际加载gem,我需要require 'my_gem'。因此,为了解决这个问题,我需要将主机应用程序的Gemfile中的这一行替换为gem my-gem, require: "my_gem" (或者修复这个令人困惑且随意的命名方案:)。
https://stackoverflow.com/questions/25372024
复制相似问题