我是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)
我做错了什么?
答案 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
。