【问题标题】:How to gemify a Rails (engine) plugin?如何宝石化 Rails(引擎)插件?
【发布时间】:2009-10-15 15:10:25
【问题描述】:

我有一个engine style Rails plugin,我可以从中使用Jeweler 创建一个gem。但是当我在我的 Rails 环境(或 erb)中需要它时,插件中的模型不会被加载。我遵循了许多教程并阅读了有关该主题的所有内容。

# environment.rb
config.gem 'myengine'

# in irb
require 'myengine'

我已解压缩 gem 并验证所有文件都存在。我的 init.rb 已移至名为“rails”as per 的新文件夹中。 'lib' 中的所有文件都会自动添加到 $LOAD_PATH,因此 require 'myengine' 运行 lib/myengine.rb。我通过在其中添加puts 'hello' 来验证这一点。

是不是因为插件在已知位置的物理存在,Rails 可以将所有模型、控制器等添加到相关的 load_paths 中?使用 gem 时需要手动复制吗?

gemspec require_paths 是一种添加除 lib 之外的其他路径的方法吗?然而,我假设 Rails 不仅需要每个文件,而是按需加载它们,因此需要文件名和类名匹配?

【问题讨论】:

    标签: ruby-on-rails rubygems


    【解决方案1】:
    %w{ models controllers helpers }.each do |dir|
      path = File.join(File.dirname(__FILE__), 'app', dir) + '/'
    
      $LOAD_PATH << path
    
      puts 'requiring'
      Dir.new(path).entries.each do |file|
        if file =~ /\.rb/
          puts file
          require file
        end
      end
    end
    

    通过将上述内容添加到 lib/myengine.rb 中,所有模型/控制器都是必需的。但就像我在问题中所说的那样,这不太可能是一个好的前进方向。

    【讨论】:

      【解决方案2】:

      顺便说一句,关于将这些目录添加到搜索路径的部分是正确的。您不需要做的是手动要求每个文件(正如您在最后一句话中提到的那样)。当你引用一个不存在的常量时,Rails 的作用是在加载路径中搜索同名的文件(当然是下划线)。

      如果由于某种原因你不能遵守约束(仔细想想),那么你需要更深入地研究 Rails,看看重载机制是如何工作的,这样你就可以在开发模式下正确地绑定它.

      【讨论】:

      • 只是添加搜索路径似乎不起作用。这可能与类重新加载的问题有关——我将尝试进一步的实验。也许我需要我的插件在每个请求时重新加载......
      【解决方案3】:

      问题是文件(在应用程序中)没有被添加到 gem 中,因为当使用 Jeweler 时,它只会自动将文件添加到 required_paths 并提交给 git。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        相关资源
        最近更新 更多