Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从Rails3中的lib文件夹加载模块/类的最佳方法?_Ruby On Rails_Class_Module_Autoload_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 从Rails3中的lib文件夹加载模块/类的最佳方法?

Ruby on rails 从Rails3中的lib文件夹加载模块/类的最佳方法?,ruby-on-rails,class,module,autoload,ruby-on-rails-3,Ruby On Rails,Class,Module,Autoload,Ruby On Rails 3,由于最新的Rails 3版本不再从lib自动加载模块和类, 加载它们的最佳方式是什么 来自github: ,在config/application.rb中有一个设置,您可以在其中指定包含要自动加载的文件的目录 从application.rb: # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/extras)

由于最新的Rails 3版本不再从lib自动加载模块和类, 加载它们的最佳方式是什么

来自github:

,在
config/application.rb
中有一个设置,您可以在其中指定包含要自动加载的文件的目录

从application.rb:

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

如果只有某些文件需要访问lib中的模块,只需向需要它的文件添加require语句即可。例如,如果一个模型需要访问一个模块,请添加:

require 'mymodule'

在model.rb文件的顶部。

我也遇到了同样的问题。下面是我如何解决它的。该解决方案加载lib目录和所有子目录(不仅仅是direct)。当然,您可以将其用于所有目录

# application.rb
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
资料来源:


请注意,lib文件夹中包含的文件仅在服务器启动时加载。如果您想让comfort自动加载这些文件,请阅读:。请注意,这并不适用于生产环境,因为永久重新加载会降低机器的速度。

非常类似,但我认为这有点优雅:

config.autoload_paths += Dir["#{config.root}/lib", "#{config.root}/lib/**/"]

config.autoload_路径对我不起作用。我用另一种方法解决它

RubyonRails3不会从/lib文件夹自动重新加载(自动加载)代码。我通过将
ApplicationController

自动加载的魔力 我认为其他答案中已经充分涵盖了控制自动加载内容的文件夹的选项。然而,如果其他人在加载东西时遇到问题,尽管他们已经按照要求修改了自动加载路径,那么这个答案试图解释自动加载东西背后的魔力

因此,当涉及到从子目录加载内容时,您应该知道有一个问题或约定。有时候Ruby/Rails的魔力(这次主要是Rails)会让人很难理解为什么会发生某些事情。只有当模块名与父目录名对应时,才会加载自动加载路径中声明的任何模块。因此,如果您试图将以下内容放入
lib/my_stuff/bar.rb
中:

module Foo
  class Bar
  end
end
它不会自动加载。然后,如果您将父目录重命名为
foo
,从而将模块托管在路径:
lib/foo/bar.rb
。它会为你而存在。另一个选项是用模块名命名要自动加载的文件。显然,只有一个文件名为该名称。如果你需要将你的东西分割成许多文件,你当然可以使用一个文件来要求其他文件,但我不建议这样做,因为当你在开发模式下修改其他文件时,Rails无法自动为你重新加载它们。但是如果您真的需要,您可以使用模块名创建一个文件,然后指定使用该模块所需的实际文件。因此,您可以有两个文件:
lib/my_stuff/bar.rb
lib/my_stuff/foo.rb
,前者与上面相同,后者包含一行:
需要“bar”
,这将同样适用

另外,我觉得有必要再补充一件重要的事情。最近,每当我想在lib目录中有一些需要自动加载的东西时,我倾向于认为如果这是我专门为这个项目开发的东西(通常是这样的,有一天它可能会变成“静态的”许多项目或git子模块等中使用的代码片段。在这种情况下,它肯定应该在lib文件夹中)那么它可能根本不在lib文件夹中。也许它应该在app文件夹下的一个子文件夹中。我感觉这是rails新的做事方式。显然,同样的魔力也在你的自动加载路径中,你把你的东西放进去,这样对这些东西是有好处的。不管怎样,这只是我对这个问题的看法。你可以不同意。:)


更新:关于魔法的类型。


正如severin在他的评论中指出的,核心“自动加载模块机制”肯定是Ruby的一部分,但自动加载路径的东西不是。你不需要Rails自动加载:Foo,File.join(Rails.root,“lib”,“my_stuff”,“bar”)。当您第一次尝试引用模块Foo时,它将为您加载。然而Rails所做的是,它为我们提供了一种尝试从已注册的文件夹中自动加载内容的方法,这种方法的实现方式需要假定一些命名约定。如果不是这样实现的,那么每次引用当前未加载的内容时,都必须遍历所有自动加载文件夹中的所有文件,并检查其中是否有任何文件包含您试图引用的内容。这反过来又会挫败自动加载和自动重新加载的想法。但是,有了这些约定,它可以从您试图加载的模块/类中扣除可能定义的模块/类,然后只加载该模块/类。

警告:如果您想从“lib”文件夹加载“monkey patch”或“open class”,请不要使用

  • “”方法:仅当加载仅在一个位置定义的类时才有效。如果某个类已经在其他地方定义过,那么您不能通过这种方法再次加载它

  • “方法:总是有效的!无论目标类是新类还是现有类的“开放类”或“猴子补丁”,它总是有效的


有关更多详细信息,请参阅:

从lib加载时可能出现问题的原因有很多-有关详细信息,请参阅此处-

  • 固定自动加载路径
  • 线程安全相关
  • 命名关联

在我的例子中,我试图直接在lib目录下加载一个文件

在application.rb中

require '/lib/this_file.rb' 
即使在控制台中,当我试着

require './lib/this_file.rb' 
rails将加载该文件
module Foo
  class Bar
  end
end
require '/lib/this_file.rb' 
require './lib/this_file.rb'