0

假设我有以下文件:

|- app
|  |- helpers
|  |  |- application_helper.rb
|- config
|- |- application.rb
|- lib
|  |- my_module
|  |  |- my_class.rb

我正在尝试让 Rails 自动加载my_module。在application.rb我设置

config.autoload_paths += %W(#{config.root}/lib)

我还设法获得了一个秘密知识,即为了使自动加载工作,模块和类的名称必须与目录和文件的名称匹配,所以my_class.rb看起来像这样:

module MyModule
  class MyClass
    # ...
  end
end

现在我想MyClass在我的application_helper.rb

module ApplicationHelper

  include MyModule

  def some_method(active_entry = nil)
    someobject = MyClass.new
    #...
  end

end

但我收到一个错误

uninitialized constant ApplicationHelper::MyClass

为了使这段代码工作,我必须更换

someobject = MyClass.new

someobject = MyModule::MyClass.new

这是丑陋的。我认为它include会像 C++ using namespace、 C#using或 Java一样工作,import但显然不是。那么Ruby中是否有与上述语句等效的方法?

4

2 回答 2

1

@ChuckE 很接近,您需要做的是将 config.autoload_paths 更改为

config.autoload_paths += Dir["#{config.root}/lib/**/"]

以下对我有用

  • 创建目录app/lib/my_module
  • 在那里创建文件称为my_module.rb

文件内容:

module MyModule
  class MyClass
    def self.hello
      puts "Hello"
    end
  end
end
  • 确保config.autoload_paths如上所述
  • rails console

输出:

[tharrison@mbpro:~/Sites/test] rails c
Loading development environment (Rails 3.2.9)
1.9.3-p194 :001 > include MyModule
 => Object 
1.9.3-p194 :002 > MyClass.hello
Hello
 => nil 

我还没有从应用程序中尝试过这个,但看不出为什么它与从 rails 控制台运行有什么不同。

哦,还有信用应得的:从Rails 3 中从 lib 文件夹加载模块/类的最佳方式得到这个?

于 2012-11-29T14:35:50.073 回答
0

而不是这个:

config.autoload_paths += %W(#{config.root}/lib)

尝试这个:

config.autoload_paths += Dir["#{config.root}/lib"]
于 2012-11-29T14:09:00.683 回答