在没有Rails的Ruby中进行部分HAML模板化

对于我的小项目,我真的不需要Rails的开销,所以我只想使用普通的Ruby和HAML来实现这一点。

我想在我的HAML模板中包含另一个HAML文件。 但我还没有找到一种好的或实用的方法。

例如,我有这两个HAML文件:

documents.haml

%html %body = include(menu.haml) body %article … 

menu.haml

 %ul %li %a whatever … 

包括显然不是去这里的方式。 但它描述了我在这个例子中想要实现的目标。

我以前做过这个,只是为了一个快速而肮脏的模板制作人。 最简单的方法是在父对象中呈现HAML:

 %p some haml that's interesting = Haml::Engine.new('%p this is a test').render %p some more template 

你很可能想要构建一些方法来使这更容易 – 一些辅助方法。 也许你写一个名为render_file的文件,它将文件名作为参数。 该方法可能类似于:

 def render_file(filename) contents = File.read(filename) Haml::Engine.new(contents).render end 

然后,您的模板看起来更像:

 %p some template = render_file('some_filename.haml') %p more template 

注意,您可能需要将self传递给原始的Haml :: Engine渲染,以便它知道如何找到您的render_file方法。

我完全推荐这些东西的Tiltgem。 它提供了一个标准界面,用于使用相同的API呈现许多不同的模板语言,允许您设置自定义范围和本地,允许您使用yield,并且稳健且快速。 Sinatra正在将它用于模板。

例:

 require 'haml' require 'tilt' template = Tilt.new('path/to/file.haml') # => # layout = Tilt.new('path/to/layout.haml') output = layout.render { template.render } 

这使得您可以在布局内部生成渲染模板,就像Rails一样。 至于部分,大卫已经描述了一个简单而好的方法。

但实际上,如果您正在编写的内容将通过HTTP提供,我建议您查看已经提供模板的Sinatra ,并且具有您可以想象的最简单的请求路由。

我只是使用David Richards以连接方式发布的指令取得了巨大成功,没有变量,如下所示:

= Haml::Engine.new(File.read('/Volumes/Project/file_to_include.haml')).render

显然有一种更优雅的方式。 但对于只想包含一个或两个文件的人来说,这应该很好用。 这是一个缺点,使用这些包含的所有基本文件必须在对后者进行一些更改后重新编译。 如果环境允许的话,使用php include可能是值得的。

 def render_file(filename) contents = File.read('views/'+filename) Haml::Engine.new(contents).render end 

(添加这个半冗余答案,以显示如何将其他答案中的技术合并。)

在您的设置代码中包含类似的内容,以便对Haml库进行修补。

 module Haml::Helpers def render_haml(filename) contents = File.read(Rails.root.join("app", "assets", "templates", filename)) Haml::Engine.new(contents).render end end 

然后在你的Haml文件中

 .foo = render_haml('partial.haml') .bar 

显然这是一个Rails-ish示例(因为我想在我的资产管道中使用HAML而不是视图)…你会想要用一种方法来替换Rails.root.join(...)项目的模板或部分目录。