11

我是 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 '<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

我还尝试将要求添加到 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)

我究竟做错了什么?

4

2 回答 2

11

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

我的另一个问题是,在 Rails 有机会增强 require 以查看其目录之前,我试图在启动序列中过早地执行 require。当我将“require 'file_util'”添加到 config/environments/development.rb 时,它工作正常。

但这并不能解释为什么我不能从 rails 控制台手动要求该文件。

于 2010-07-05T20:29:12.060 回答
7

Monkeypatching 类可以通过在config/initializers. 所有这些文件都由Rails 在启动时自动加载。

您可以随意调用初始化程序文件。试试config/initializers/file.rb

于 2012-11-19T17:38:43.903 回答