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?如何在没有使用需求的情况下走出轨道?
答案 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
命令的情况下包含模型。
其他资源: