2011-01-27 11 views
6

? Espero establecer una ruta predeterminada para el registro, relativa a la ruta del archivo usando el registro, algo como esto:¿Cómo puedo acceder al __FILE__ actual en una subclase de un método en la superclase en ruby ​​

# /path/to/lib/bar.rb 
class Bar 
    def settings_file_path 
    File.dirname(File.expand_path(__FILE__)) 
    end 
end 

# /path/to/app/models/foo.rb 
class Foo < Bar 
end 

Foo.new.settings_file_path 

de salida ideal:

# => /path/to/app/models 

salida real:

# => /path/to/lib 

Debido ARCHIVO hace referencia al archivo donde está escrito, no desde dónde se llama, devuelve el archivo bar.rb, pero quiero que algo así devuelva la ruta del archivo foo.rb, aunque el método esté definido en Bar .

¿Alguien tiene alguna sugerencia?

Respuesta

6

Lo más sencillo sería algo como esto:

# foo.rb 
class Foo 
    def self.my_file 
    @my_file 
    end 
end 

# bar.rb 
class Bar < Foo 
    @my_file = __FILE__ 
end 

# main.rb 
require_relative 'foo' 
require_relative 'bar' 
p Bar.my_file 
#=> "/Users/phrogz/Desktop/bar.rb" 

Sin embargo, se podría analizar la persona que llama en un gancho self.inherited así:

# foo.rb 
class Foo 
    class << self 
    attr_accessor :_file 
    end 
    def self.inherited(k) 
    k._file = caller.first[/^[^:]+/] 
    end 
end 

# bar.rb 
class Bar < Foo 
end 

# main.rb 
require_relative 'foo' 
require_relative 'bar' 

p Bar._file 
#=> "/Users/phrogz/Desktop/bar.rb" 

No estoy seguro de la solidez o portable que el análisis es; Sugiero que lo pruebes.

N.B. Mi Bar hereda de Foo, al revés de su pregunta. No se confunda con las diferencias en nuestras configuraciones.

-3

Uso $ 0 en lugar de __ FILE__ :)

+0

Esto ayuda a ciencia cierta, y fue genial para aprender, pero supongo que mi pregunta fue demasiado simplificado. $ 0 devuelve el nombre de archivo del programa principal en ejecución, que funciona para mi ejemplo, pero no si estoy ejecutando un archivo diferente (o una aplicación de Ruby on Rails completa, por ejemplo) que incluye los archivos Foo y Bar. ¡Gracias! –

Cuestiones relacionadas