使用guard渲染一个相对haml

时间:2016-08-17 06:21:38

标签: ruby filesystems haml guard

我的文件结构如下:

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,该死的。有什么建议?我只需要从同一目录中的文件中获取文件。

1 个答案:

答案 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'

(我认为值得指出的是,如果其中一个“子”模板被更改,此设置将不会自动重建“父”文件。)