17

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

我想在我的 HAML 模板中包含另一个 HAML 文件。但我还没有找到一个好的——或真正有用的——这样做的方法。

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

文档.haml

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

菜单.haml

%ul
 %li
  %a whatever …

包含显然不是这里的方法。但它很好地描述了我在这个例子中想要实现的目标。

4

5 回答 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 一样。至于部分,大卫已经描述了一个简单而好的方法。

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

于 2011-03-25T21:46:12.383 回答
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_file 方法。

于 2011-03-25T19:06:28.937 回答
3

仅使用David Richards以串联方式发布的说明,没有变量,我就取得了巨大的成功,如下所示:

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

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

于 2013-04-20T20:01:56.210 回答
0
def render_file(filename)
  contents = File.read('views/'+filename)
  Haml::Engine.new(contents).render
end
于 2012-11-29T11:09:13.957 回答
-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 而不是作为视图)......您将希望用在项目的模板或部分目录Rails.root.join(...)中查找的方法进行替换。filename

于 2014-04-26T14:02:50.863 回答