要求加载路径中的类所需的语句?

时间:2015-01-16 16:48:08

标签: ruby-on-rails ruby

ruby​​全局变量$:显示加载路径中的内容。当我查看rails应用程序的加载路径时,我立即注意到Rails根目录中的lib目录:

puts $:
/Users/myuser/projects/myproject/lib
/Users/myuser/projects/myproject/app/assets
/Users/myuser/projects/myproject/app/controllers
/Users/myuser/projects/myproject/app/helpers
/Users/myuser/projects/myproject/app/mailers
/Users/myuser/projects/myproject/app/models
...

我添加了一个名为my_module.rb的文件,它包含一个模块MyModule。我坚持使用一种名为hello_world的方法来放置“你好世界”。现在,当我将模块包含在rails模型中时,如下所示:

class MyModel < ActiveRecord::Base
  include MyModule
end

然后我启动控制台:

2.1.2 :001 > m = MyModel.new
NameError: uninitialized constant MyModel::MyModule

Ruby无法找到MyModel源文件。为了使其工作,我必须明确要求:

class MyModel < ActiveRecord::Base
  require 'my_module'
  include MyModule
end

现在一切正常:

2.1.2 :001 > m = MyModel.new
2.1.2 :001 > b.hello_world
2.1.2 :001 > hello world
2.1.2 :001 > => nil 

由于lib已经在加载路径中,为什么我还必须明确要求MyModule?如何在没有使用需求的情况下走出轨道?

1 个答案:

答案 0 :(得分:1)

$:$LOAD_PATH变量包含Ruby将搜索模块或类所需文件的路径列表。只搜索并且不包含&#39;他们,所以你必须自己照顾它。

Rails具有自动加载功能,您可以在config/appliaction.rb文件或特定于环境(config / enviroments / development.rb)中定义它。 Here you have more informations。您可以添加以下内容:

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

之后,您可以在不使用require命令的情况下包含模型。

其他资源:

telladifferentstory

blogarkency