【问题标题】:Rails Railtie initializer does not runRails Railtie 初始化程序不运行
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。这绝对很方便。
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多