2012-09-05 8 views
7

Używam wbudowanego ruby ​​(ERB) do generowania plików tekstowych. Muszę znać katalog pliku szablonu, aby znaleźć inny plik względem ścieżki pliku szablonu. Czy w ERB istnieje prosta metoda, która da mi nazwę pliku i katalog bieżącego pliku szablonu?Jak znaleźć ścieżkę pliku szablonu za pomocą ERB?

Szukam czegoś podobnego do __FILE__, ale podając plik szablonu zamiast (erb).

Odpowiedz

8

Gdy używasz api ERB z Ruby, podajesz ciąg znaków do ERB.new, więc nie ma żadnego sposobu, aby ERB wiedział, skąd pochodzi ten plik. Można jednak powiedzieć, że obiekt, który plik pochodzi pomocą atrybutu filename:

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

Teraz można użyć __FILE__ w my_template.erb i będzie odnosić się do nazwy pliku. (Tak robi plik erb, dlatego też __FILE__ działa w plikach ERB uruchamianych z wiersza poleceń).

Aby to nieco nieco bardziej przydatny zrobić, można małpa łata ERB z nowej metody do odczytu z pliku i ustawić 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 

Możesz teraz użyć tej metody do odczytu plików ERB i __FILE__ powinny działać w nich, i odnoszą się do konkretnego pliku, a nie tylko (erb):

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

Chciałbym wiedzieć, jak to zrobić z erubis też – 2rs2ts

+0

NVM, to samo jest z erubis. po prostu ustaw '.filename = 'my_template.erb'' – 2rs2ts