我使用嵌入式ruby(ERB)生成文本文件。我需要知道模板文件的目录,以便找到相对于模板文件路径的另一个文件。 ERB中是否有一个简单的方法可以提供当前模板文件的文件名和目录?
我正在寻找与__FILE__
类似的内容,但是提供模板文件而不是(erb)。
答案 0 :(得分:8)
当您使用Ruby中的ERB api时,您为ERB.new
提供了一个字符串,因此ERB无法知道该文件的来源。但是,您可以使用filename
属性告诉对象来自哪个文件:
t = ERB.new(File.read('my_template.erb')
t.filename = 'my_template.erb'
现在您可以在__FILE__
中使用my_template.erb
,它将引用该文件的名称。 (这是erb
可执行文件的作用,这就是__FILE__
在从命令行运行的ERB文件中工作的原因。)
为了使这一点更有用,您可以使用新方法修补ERB以从文件中读取并设置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
您现在可以使用此方法读取ERB文件,__FILE__
应该在其中工作,并参考实际文件,而不只是(erb)
:
t = ERB.from_file 'my_template.erb'
puts t.result