自动装饰品的魔力
我认为控制自动装填的文件夹的选项在其他答案中已经足够了。然而,如果其他人有困难的东西加载,虽然他们已经修改了他们的自动路径要求,然后这个答案试图解释什么是魔术背后的自动加载的事情。
因此,在从子目录加载内容时,您应该注意到一个问题或约定。有时候,Ruby/Rails的魔力(这次主要是Rails)会让人很难理解为什么会发生一些事情。只有当模块名称与父目录名称相对应时,自动加载路径中声明的任何模块才会被加载。所以如果你想把lib/my_stuff/bar.rb
类似于:
module Foo
class Bar
endend
它不会自动加载。如果将父dir重命名为foo
因此,将模块托管在PATH上:lib/foo/bar.rb
..它会在你身边的。另一个选项是将您想要的文件命名为模块名。很明显,那么只能有一个名为这个名称的文件。如果您需要将您的文件拆分成许多文件,您当然可以使用该文件来要求其他文件,但我不建议这样做,因为在开发模式和修改其他文件时,Rails无法自动为您重新加载这些文件。但是,如果您真的想要的话,您可以按模块名获得一个文件,然后指定使用该模块所需的实际文件。所以你可以有两个文件:lib/my_stuff/bar.rb
和lib/my_stuff/foo.rb
前者与上面相同,后者包含一条单行:require "bar"
这也同样有效。
我觉得我不得不补充一件更重要的事情。最近,每当我想要在lib目录中有一些需要自动加载的内容时,我就会开始想,如果这是我专门为这个项目开发的东西(通常是这样的),有一天它可能会变成许多项目或Git子模块中使用的“静态”代码片段,等等。在这种情况下,它肯定应该在lib文件夹中),那么它的位置可能根本不在lib文件夹中。也许它应该在应用程序文件夹下的一个子文件夹中。我有一种感觉,这是一种新的Rails方式。显然,同样的魔法也在起作用,不管你把你的东西放在什么地方,它对这些东西都有好处。总之,这只是我对这个问题的想法。你可以自由地不同意。*)
更新:关于魔法的类型.。
正如Severin在他的评论中指出的那样,核心的“自动加载模块机制”当然是Ruby的一部分,但是自动加载路径不是。autoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
..当您第一次尝试引用模块foo时,它将为您加载。然而,Rails所做的是,它为我们提供了一种尝试从已注册文件夹中自动加载东西的方法,并且已经以这样一种方式实现了,即它需要假定一些关于命名约定的内容。如果没有这样实现,那么每次引用当前未加载的内容时,它都必须遍历所有autooload文件夹中的所有文件,并检查其中是否包含您试图引用的内容。这反过来又会挫败自动加载和自动加载的想法。但是,有了这些约定之后,它可以从您试图加载的模块/类中扣除可能定义的内容,并只加载该模块/类。