为了账号安全,请及时绑定邮箱和手机立即绑定

从Rails 3中的lib文件夹加载模块/类的最佳方法?

从Rails 3中的lib文件夹加载模块/类的最佳方法?

萧十郎 2019-07-06 13:09:07
从Rails 3中的lib文件夹加载模块/类的最佳方法?由于最新的Rails 3版本不再是从lib中自动加载模块和类,那么加载它们的最佳方法是什么?来自GitHub:A few changes were done in this commit:Do not autoload code in *lib* for applications (now you need to explicitly  require them). This makes an application behave closer to an engine  (code in lib is still autoloaded for plugins);
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

截至Rails 2.3.9,有一个背景config/application.rb可以在其中指定包含要自动加载的文件的目录。

来自申请.rb:

# Custom directories with classes and modules you want to be autoloadable.# config.autoload_paths += %W(#{config.root}/extras)


查看完整回答
反对 回复 2019-07-06
?
森林海

TA贡献2011条经验 获得超2个赞

自动装饰品的魔力

我认为控制自动装填的文件夹的选项在其他答案中已经足够了。然而,如果其他人有困难的东西加载,虽然他们已经修改了他们的自动路径要求,然后这个答案试图解释什么是魔术背后的自动加载的事情。

因此,在从子目录加载内容时,您应该注意到一个问题或约定。有时候,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.rblib/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文件夹中的所有文件,并检查其中是否包含您试图引用的内容。这反过来又会挫败自动加载和自动加载的想法。但是,有了这些约定之后,它可以从您试图加载的模块/类中扣除可能定义的内容,并只加载该模块/类。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 657 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信