Rails 3: как загрузить файлы в / lib? - PullRequest
11 голосов
/ 05 июля 2010

Я новичок в rails и совершаю какую-то ошибку noob: мне часто нужно посчитать количество строк в файле, поэтому я пытаюсь обезопасить класс патча File:

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)

Что я делаю не так?

Ответы [ 2 ]

11 голосов
/ 06 июля 2010

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

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

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

7 голосов
/ 19 ноября 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...