【问题标题】:require statement required for classes in load path?加载路径中的类需要声明吗?
【发布时间】: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


    【解决方案1】:

    $:$LOAD_PATH 变量包含路径列表,Ruby 将在其中搜索模块或类所需的文件。只搜索而不“包含”它们,所以你必须自己照顾它。

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

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

    之后,您可以在没有require 命令的情况下包含模型。

    其他资源:

    telladifferentstory

    blogarkency

    【讨论】:

    • 如果我能合并我的账户就好了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多