Rails 3: как загрузить файлы в/lib?

Я новичок в рельсах и делаю какую-то ошибку 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

Я также попытался добавить запрос в 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)

Что я делаю неправильно?

Ответ 1

Хорошо, я, похоже, в основном понял это. Rails автоматически не требует все под /lib. Он загружает только авто, когда вы пытаетесь использовать новое имя класса, которое соответствует имени файла в lib. Поэтому, если я определяю line_count в классе FileUtil вместо File, он автоматически находит и загружает файл file_util.rb. Но исправление файла и именование файла патча "file.rb" не работает, поскольку класс File уже определен, поэтому Rails не ищет определения.

Моя другая проблема заключалась в том, что я пытался выполнить требование слишком рано в последовательности запуска, до того, как у Rails появилась возможность повысить необходимость просмотра в своих каталогах. Когда я добавил "require" file_util "" в config/environment/development.rb, он отлично работает.

Но это не объясняет, почему я не могу вручную потребовать файл из консоли rails.

Ответ 2

Классы Monkeypatching можно сделать проще, добавив файл в config/initializers. Все эти файлы автоматически загружаются Rails при запуске.

Вы можете вызвать файл инициализатора, который вы хотите. Попробуйте config/initializers/file.rb.