Ruby中不使用Rails实现部分HAML模板化。

17

我的小项目并不需要Rails框架的开销,所以我想尝试只使用纯粹的Ruby和HAML来实现它。

我想在我的HAML模板中嵌入另一个HAML文件。但我还没有找到一个好的或者真正可用的方法来做到这一点。

举个例子,我有这两个HAML文件:

documents.haml

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

menu.haml

%ul
 %li
  %a whatever …

明显地,include不是我在这里使用的正确方式。但它很好地描述了我在这个例子中试图达到的目标。

5个回答

23

我完全推荐使用Tilt gem来处理这些事情。它提供了一个标准的接口,可以使用相同的API渲染许多不同的模板语言,允许您设置自定义作用域和本地变量,使用yield,并且稳健快速。Sinatra正在使用它来处理模板。

示例:

require 'haml'
require 'tilt'

template = Tilt.new('path/to/file.haml')
# => #<Tilt::HAMLTemplate @file="path/to/file.haml" ...>
layout   = Tilt.new('path/to/layout.haml')

output = layout.render { template.render }

这让您可以在布局中使用yield获取渲染的模板,就像Rails一样。至于partials(局部视图),David已经描述了一个简单而不错的方法。

但实际上,如果您编写的内容将通过HTTP提供服务,我建议您看看Sinatra,它已经提供了模板,并且有您所能想象到的最简单的请求路由。


18

我之前做过这个,只是为了快速制作一个模板生成器。最简单的方法是在父对象中直接呈现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方法,以便它知道如何找到您的render_file方法。


谢谢,这正是我在寻找的!我很感激,也感谢您提供的辅助方法建议。 - Daniel
当然。当我做的事情能对别人有用时,感觉很好。祝你好运。 - David Richards
8
如何将帮助方法包含到Haml模板中? - Phương Nguyễn
1
我正在使用不带Rails的HAML编译器,我创建了一个名为hamlHelper.rb的文件,内容如下:https://gist.github.com/mustafah/b2fba950916457339505,并在调用编译器时使用了require参数:"haml -r hamlHelper.rb myfile.haml myfile.html"。 - Mustafah

3

我在IT技术方面遇到了问题,通过David Richards发布的指南,我取得了很好的成果。我按照他发布的一系列指令进行了拼接,而不是使用变量,就像这样:

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

显然有更优雅的方法。但是对于只想包含一两个文件的人来说,这应该可以很好地运作。这样做的一个缺点是,在后面的更改后,所有使用这些包含操作的基本文件都必须重新编译。如果环境允许,也许值得考虑使用php include。


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

9
请解释代码如何解决问题,而不仅仅是贴出一大段代码。如果没有解释,这就不是一个答案。 - Martijn Pieters

-1
(为了展示如何将其他答案中的技巧融合起来,我加入了这个半冗余的回答。)
在你的设置代码中包含类似以下内容以对 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而不是视图)...您需要用一种方法来查找项目模板或部分目录中的filename替换Rails.root.join(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接