2010-07-05 18 views
11

Soy nuevo a los rieles y hacer algún tipo de error novato: Con frecuencia necesito contar el número de líneas en un archivo, así que estoy tratando de mono del archivo de clase de parches como esto:Rails 3: cómo cargar archivos en/lib?

class File 
    def self.line_count(filename) 
    %x{wc -l #{filename}}.split.first.to_i 
    end 
end 

I guardado esto en /lib/file_util.rb. Pensé que esto iba a ser auto-requerido, por lo que tan sólo pudiera usarlo, pero que no funciona:

$ rails console 
>> File.line_count('Gemfile') 
NoMethodError: undefined method `line_count' for File:Class 
... 

así que trato de requerir de forma manual, no hay alegría:

>> require '<myproj>/lib/file_util.rb' # same result with require 'file_util.rb' 
=>nil 

Pero funciona si necesito dentro de IRB:

$ irb 
>> require '<myproj>/lib/file_util.rb' 
=> true 
>> File.line_count('Gemfile') 
=> 22 

también traté de añadir la requieren a config/application.rb:

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

require 'file_util.rb' 

module <myproj> 
... 

y me sale:

$ rails console 
<myproj>/config/application.rb:9:in `require': no such file to load -- file_util.rb (LoadError) 

¿Qué estoy haciendo mal?

Respuesta

11

Ok, parece que lo he descubierto en su mayoría. Rails no requiere automáticamente todo en/lib. Solo se carga automáticamente cuando intenta utilizar un nuevo nombre de clase que coincida con un nombre de archivo en lib. Entonces, si defino line_count en la clase FileUtil en lugar de File, automáticamente encuentra y carga 'file_util.rb'. Pero el parcheo de archivos y el nombre del archivo de parche 'file.rb' no funciona, ya que la clase File ya está definida, por lo que Rails no busca una definición.

Mi otro problema era que estaba tratando de hacer el requerimiento demasiado pronto en la secuencia de inicio, antes de que Rails tuviera la oportunidad de mejorar requiera buscar en sus directorios. Cuando agregué "require 'file_util'" a config/environments/development.rb, funciona bien.

Pero esto no explica por qué no puedo solicitar manualmente el archivo desde la consola de rails.

+1

Sí, la designación del archivo para la carga automática funcionó para mí. No sabía que estaba conectado de esa manera ahora. – squarism

+1

Me encontré con ese problema también. Esto es lo que hago para forzar automáticamente todos los archivos en lib necesarios: http://stackoverflow.com/questions/4235782/rails-3-library-not-loading-until-require/6797707#6797707 –

7

Las clases de parcheo de macros se pueden realizar más fácilmente al agregar un archivo en config/initializers. Todos esos archivos son cargados automáticamente por Rails al inicio.

Puede llamar al archivo de inicializador todo lo que desee. Pruebe config/initializers/file.rb.