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
Chciałbym wiedzieć, jak to zrobić z erubis też – 2rs2ts
NVM, to samo jest z erubis. po prostu ustaw '.filename = 'my_template.erb'' – 2rs2ts