【发布时间】:2014-08-18 21:06:15
【问题描述】:
我正在开发一个用于 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 插件和 railtie 教程,他们都说只需将 gem 添加到您的 Gemfile 中,一切都应该正常工作。谁能发现我做错了什么?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 gem railtie