11

私はレールに不慣れで、ある種の初心者の間違いを犯しています。ファイル内の行数を頻繁にカウントする必要があるため、次のようにクラス ファイルにパッチを適用しようとしています。

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)

私は何を間違っていますか?

4

2 に答える 2

11

わかりました、私はほとんどそれを理解したようです。Rails は /lib 以下のすべてを自動的に要求するわけではありません。libのファイル名と一致する新しいクラス名を使用しようとした場合にのみ、自動ロードされます。したがって、クラス FileUtil で File の代わりに line_count を定義すると、自動的に「file_util.rb」が検索されてロードされます。しかし、File クラスが既に定義されているため、File にパッチを適用してパッチ ファイルに 'file.rb' という名前を付けても機能しません。そのため、Rails は定義を探しません。

私のもう 1 つの問題は、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 に答える