代码之家  ›  专栏  ›  技术社区  ›  Kris

如何定义Rails(引擎)插件?

  •  0
  • Kris  · 技术社区  · 16 年前

    我有一个 engine style Rails plugin 从中我可以用 Jeweler .但是当我在Rails环境(或erb)中需要它时,插件中的模型不会被加载。我已经学习了很多教程,并阅读了关于这个主题的所有内容。

    # environment.rb
    config.gem 'myengine'
    
    # in irb
    require 'myengine'
    

    我已经解包了gem并验证了所有文件都存在。我的init.rb已移动到一个名为“rails”的新文件夹中 as per .“lib”中的所有文件都自动添加到$load_路径,因此 require 'myengine' lib/myengine.rb . 我用一个 puts 'hello' 内。

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

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

    3 回复  |  直到 16 年前
        1
  •  0
  •   Kris    16 年前
    %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
  •  0
  •   gtd    16 年前

    我马上要说的是,将这些目录添加到搜索路径的部分是正确的。您不需要做的是手动地要求每个文件(正如您在最后一句中提到的那样)。当您引用一个不存在的常量时,Rails所做的就是在加载路径中搜索具有相同名称(当然是下划线)的文件。

    如果出于某种原因,您不能遵守约束(长时间地、艰难地考虑它),那么您需要深入地挖掘Rails,并了解重载机制是如何工作的,以便在开发模式中正确地与之绑定。

        3
  •  0
  •   Kris    16 年前

    问题在于没有添加到gem中的文件(应用程序中),因为使用jeweller时,它只会自动将文件添加到 required_paths 承诺给Git。

    推荐文章