我的文件结构如下:
Guardfile
resolution1/menu/page1.haml
resolution1/menu/some_partial.haml
resolution2/...
resolution3/...
现在,在page1.haml里面我有一行会在里面呈现一个部分haml(我没有使用Rails)
= Haml::Engine.new(File.read("./some_partial.haml")).render
失败了:
Error: No such file or directory @ rb_sysopen - ./some_partial.haml
因为我的工作目录是Guardfile所在的位置。应该采用的解决方法是:
= Haml::Engine.new(File.read("#{__dir__}/some_partial.haml")).render
或者如果我感到绝望,即使这样(获取文件绝对路径)
= Haml::Engine.new(File.read("#{File.expand_path(File.dirname(__FILE__))}/some_partial.haml")).render
但是,这不符合我的要求。在
File.expand_path(File.dirname(__FILE__))
而不是给我文件的绝对路径(不考虑工作目录),它只是给了我工作目录的绝对路径。
当然,我可以设置一条可行的路径,但我不希望在每次渲染中都包含目标分辨率。
我的 Guardfile
guard :haml, output: '../package/www' do
watch(/^.+(\.haml)$/)
end
我正在使用Windows,该死的。有什么建议?我只需要从同一目录中的文件中获取文件。
答案 0 :(得分:1)
这是由Guard :: Haml处理模板的原因造成的。 It (currently) does this:
content = File.new(file).read
engine = ::Haml::Engine.new(content, (options[:haml_options] || {}))
它将模板读入字符串,然后将该字符串传递给Haml。这意味着当Haml看到字符串时,它无法知道它应该与哪个文件相关联。
Haml有:filename
option,允许您将文件名传递给Haml。这允许__FILE__
和__dir__
正常工作,但Guard :: Haml目前不使用它。
我创建了一个pull request that adds this feature。如果您想在合并之前尝试该代码并且发布新版本(假设它被接受),您可以使用我的repo上的分支。为此,请将Gemfile
更改为:
gem 'guard-haml', :github => "mattwildig/guard-haml", :branch => 'filename_option'
(我认为值得指出的是,如果其中一个“子”模板被更改,此设置将不会自动重建“父”文件。)