如何在rails引擎的lib目录中扩展模块

时间:2016-01-12 15:30:58

标签: ruby-on-rails ruby asset-pipeline

我在vendor/engine_name/lib/qa/qa.rb中有一个模块,并希望扩展该模块以在单独的文件Foo中包含一个类vendor/engine_name/lib/qa/foo.rb,以便foo.rb看起来像此

module QA
  class Foo
    # code here
  end
end

当我尝试在qa.rb中创建Foo实例时,我得到NameError

我尝试使用不同的文件路径加载foo.rb,但它们都不起作用。如何正确扩展模块需要做什么?

1 个答案:

答案 0 :(得分:1)

这将有效:

qa.rb:

require "./foo"

module QA
  class Dog
  end
end

QA::Foo.new

但是,路径./foo是相对于您运行程序的目录,可能不是qa/目录。

这样更好:

qa.rb:

require_relative "./foo"

module QA
  class Dog
  end
end

QA::Foo.new

require_relative查找包含require_relative语句的路径relative to the file

如果您编写require 'foo' - 没有路径 - 那么ruby只会在某些预定义目录中搜索foo.rb,您可以通过查看输出来检查:

require "pp"
pp $LOAD_PATH

--output:--

["/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/x86_64-darwin14",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/vendor_ruby/2.2.0",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/vendor_ruby/2.2.0/x86_64-darwin14",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/vendor_ruby",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0",
 "/Users/7stud/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/x86_64-darwin14"]

您始终可以向该阵列添加目录,例如

$LOAD_PATH.unshift '/path/to/your/ruby/file/'  #add to front of array
require 'your_ruby_file_name'