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

时间:2010-07-05 17:35:15

标签: ruby-on-rails-3 require autoload

我是rails的新手并且犯了一些noob错误:我经常需要计算文件中的行数,所以我试图像这样编写补丁类文件:

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

我还尝试将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 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:7)

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

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