Rails Railtie初始化程序不运行

时间:2014-08-18 21:06:16

标签: ruby-on-rails ruby ruby-on-rails-4 gem railtie

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

1 个答案:

答案 0 :(得分:1)

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