Rails 3: 如何在/lib目录中加载文件?

10

我是Rails的新手,做了一些初学者的错误:我经常需要计算文件中的行数,因此我尝试像这样对File类进行猴子补丁:

class File
  def self.line_count( filename ) 
    %x{wc -l #{filename}}.split.first.to_i  
  end
end

我把它保存到/lib/file_util.rb文件中。我以为这个文件会被自动引用,所以我可以直接使用它,但是这样却行不通:

$ rails console
>> File.line_count('Gemfile')
NoMethodError: undefined method `line_count' for File:Class
...

所以我尝试手动require它,但没有成功:

>> require '<myproj>/lib/file_util.rb' # same result with require 'file_util.rb'
=>nil

但如果我在IRB中要求它,它就可以正常工作:

$ irb
>> require '<myproj>/lib/file_util.rb'
=> true
>> File.line_count('Gemfile')
=> 22

我也尝试将require添加到config/application.rb中:

...
Bundler.require(:default, Rails.env) if defined?(Bundler)

require 'file_util.rb'

module <myproj>
...

我得到的结果是:

$ rails console
<myproj>/config/application.rb:9:in `require': no such file to load -- file_util.rb (LoadError)

我做错了什么?

2个回答

11

好的,我似乎大部分问题都解决了。Rails并不会自动加载/lib目录下的所有内容。只有在您尝试使用与lib文件名匹配的新类名时,它才会自动加载。因此,如果我将line_count定义在FileUtil类中而不是File类中,它会自动查找并加载“file_util.rb”。但是,对File进行补丁并将补丁文件命名为'file.rb'是行不通的,因为File类已经定义了,所以Rails不会去寻找定义。

我的另一个问题是,在启动序列之前,我尝试太早进行require操作,此时Rails还没有机会增强require操作以查找其目录中的内容。当我在config/environments/development.rb中添加“require 'file_util'”后,它可以正常工作。

但这并不能解释为什么我无法在Rails控制台中手动require该文件。


1
是的,将文件命名为autoload对我有用。我不知道现在它是这样连接的。 - squarism
1
我也遇到了这个问题。以下是我自动强制要求 lib 目录下所有文件的方法:https://dev59.com/hG855IYBdhLWcg3woV0_#6797707 - Tyler Rick

7

通过在config/initializers中添加文件,可以更轻松地进行类的Monkeypatching。所有这些文件都会在Rails启动时自动加载。

您可以将初始化文件命名为任何您想要的名称。尝试使用config/initializers/file.rb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接