0

我正在开发一个用于 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 中,一切都应该正常工作。谁能发现我做错了什么?

4

1 回答 1

1

我几乎是在我发布后立即想通的。我的 gem 名称是my-gem,但模块的文件名是my_gem.rb. 在我的主机应用程序的 Gemfile 中,我有这行gem my-gem,但要实际加载我需要的 gem require 'my_gem'。所以,为了解决这个问题,我需要将主机应用程序的 Gemfile 中的那一行替换为gem my-gem, require: "my_gem"(或修复这个令人困惑和随意的命名方案:)。

于 2014-08-18T21:16:45.937 回答