【发布时间】:2015-03-15 08:13:21
【问题描述】:
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 的方法,该方法放置“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? Rails 是如何摆脱在所有地方都不需要使用 require 的呢?
【问题讨论】:
标签: ruby-on-rails ruby