2012-09-05 8 views
7

Estoy usando Ruby incrustado (ERB) para generar archivos de texto. Necesito saber el directorio del archivo de la plantilla para localizar otro archivo relacionado con la ruta del archivo de la plantilla. ¿Existe un método simple dentro de ERB que me dé el nombre de archivo y el directorio del archivo de plantilla actual?¿Cómo puedo encontrar la ruta de un archivo de plantilla usando ERB?

Estoy buscando algo similar a __FILE__, pero dando el archivo de plantilla en lugar de (erb).

Respuesta

8

Cuando utiliza la aplicación ERB de Ruby, proporciona una cadena de ERB.new, por lo que ERB no puede saber realmente de dónde proviene ese archivo. Sin embargo, puede indicar al objeto de qué archivo se llegó a usar el atributo filename:

t = ERB.new(File.read('my_template.erb') 
t.filename = 'my_template.erb' 

Ahora puede utilizar __FILE__ en my_template.erb y se mencione el nombre del archivo. (Esto es lo que hace el ejecutable erb, por lo que __FILE__ funciona en archivos ERB que ejecuta desde la línea de comandos).

Para hacer esto un poco un poco más útil, usted podría parche mono ERB con un nuevo método para leer de un archivo y establecer el filename:

require 'erb' 

class ERB 
    # these args are the args for ERB.new, which we pass through 
    # after reading the file into a string 
    def self.from_file(file, safe_level=nil, trim_mode=nil, eoutvar='_erbout') 
    t = new(File.read(file), safe_level, trim_mode, eoutvar) 
    t.filename = file 
    t 
    end 
end 

Ahora puede utilizar este método para leer los archivos ERB y __FILE__ deben trabajar en ellos, y se refieren al archivo real y no sólo (erb):

t = ERB.from_file 'my_template.erb' 
puts t.result 
+0

me gustaría saber cómo hacer esto con erubis demasiado – 2rs2ts

+0

NVM, es lo mismo con erubis. simplemente establece '.filename = 'my_template.erb'' – 2rs2ts

Cuestiones relacionadas