Я плохо знаком с направляющими и деланием своего рода ошибки новичка: Я часто должен считать количество строк в файле, таким образом, я пробую к классу патча обезьяны Файл как это:
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)
Что я делаю неправильно?
Так, кажется, я в основном разобрался. Rails не требует автоматически все, что находится в каталоге /lib. Он автоматически загружается только тогда, когда вы пытаетесь использовать новое имя класса, которое совпадает с именем файла в lib. Так что если я определяю line_count в классе FileUtil вместо File, он автоматически находит и загружает 'file_util.rb'. Но исправление File и именование файла исправления 'file.rb' не работает, поскольку класс File уже определен, и Rails не будет искать его определение.
Другая моя проблема заключалась в том, что я пытался сделать require слишком рано в последовательности запуска, до того, как Rails успеет улучшить require для поиска в своих каталогах. Когда я добавил "require 'file_util'" в config/environments/development.rb, все работает нормально.
Но это не объясняет, почему я не могу вручную потребовать файл из консоли rails.