Mor*_*ori 11 require autoload ruby-on-rails-3
我是新来的轨道,使某种小白错误的:我经常需要计算文件中的行数,所以我想给猴子补丁类文件是这样的:
class File
def self.line_count( filename )
%x{wc -l #{filename}}.split.first.to_i
end
end
Run Code Online (Sandbox Code Playgroud)
我把它保存到/lib/file_util.rb.我认为这应该是自动要求的,所以我可以使用它,但这不起作用:
$ rails console
>> File.line_count('Gemfile')
NoMethodError: undefined method `line_count' for File:Class
...
Run Code Online (Sandbox Code Playgroud)
所以我尝试手动要求它,没有快乐:
>> require '<myproj>/lib/file_util.rb' # same result with require 'file_util.rb'
=>nil
Run Code Online (Sandbox Code Playgroud)
但是如果我在IRB中需要它,它会起作用:
$ irb
>> require '<myproj>/lib/file_util.rb'
=> true
>> File.line_count('Gemfile')
=> 22
Run Code Online (Sandbox Code Playgroud)
我还尝试将require添加到config/application.rb:
...
Bundler.require(:default, Rails.env) if defined?(Bundler)
require 'file_util.rb'
module <myproj>
...
Run Code Online (Sandbox Code Playgroud)
我得到:
$ rails console
<myproj>/config/application.rb:9:in `require': no such file to load -- file_util.rb (LoadError)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Mor*_*ori 11
好吧,我似乎已经把它弄清楚了.Rails不会自动要求/ lib下的所有内容.它只在您尝试使用与lib中的文件名匹配的新类名时自动加载.因此,如果我在类FileUtil而不是File中定义line_count,它会自动查找并加载'file_util.rb'.但修补文件并命名补丁文件'file.rb'不起作用,因为已经定义了File类,所以Rails不会寻找定义.
我的另一个问题是,我试图在启动序列中过早地执行需求,之后Rails有机会增强要求查看其目录.当我将"require'file_util'"添加到config/environments/development.rb时,它工作正常.
但这并不能解释为什么我无法从rails控制台中手动要求该文件.
通过添加文件,可以更轻松地完成Monkeypatching类config/initializers.所有这些文件都是在启动时由Rails自动加载的.
您可以根据需要调用初始化程序文件.试试config/initializers/file.rb.
| 归档时间: |
|
| 查看次数: |
13822 次 |
| 最近记录: |