2010-07-05 32 views
11

我新的軌道,使某種小白錯誤的:我經常需要計算文件中的行數,所以我想給猴子補丁類文件是這樣的:Rails 3:如何在/ lib中加載文件?

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 

我也試圖添加需要對配置/ application.rb中:

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

require 'file_util.rb' 

module <myproj> 
... 

,我也得到:

​​

我在做什麼錯?

回答

11

好吧,我似乎已經主要了解它。 Rails不會自動要求/ lib下的所有內容。它只在您嘗試使用與lib中的文件名匹配的新類名時纔會自動加載。因此,如果我在FileUtil類中定義line_count而不是File,它會自動查找並加載'file_util.rb'。但是修補文件和命名補丁文件'file.rb'不起作用,因爲File類已經定義了,所以Rails不會去查找定義。

我的其他問題是,我試圖在啓動序列中儘快執行require,之後Rails有機會增強require來查看其目錄。當我將「require'file_util'」添加到config/environments/development.rb時,它工作正常。

但這並不能解釋爲什麼我不能從rails控制檯手動要求文件。

+1

是的文件的自動加載命名爲我工作。現在不知道它是這樣連接的。 – squarism 2011-02-27 04:50:41

+1

我也遇到過這個問題。這是我所做的自動強制lib中的所有文件是必需的:http://stackoverflow.com/questions/4235782/rails-3-library-not-loading-until-require/6797707#6797707 – 2011-07-23 01:42:56

7

通過在config/initializers中添加文件,可以更輕鬆地完成Monkeypatching類。所有這些文件都是在啓動時由Rails自動加載。

你可以調用你的初始化文件任何你想要的。試試config/initializers/file.rb

相關問題