对于我的小项目,我真的不需要Rails的开销,所以我只使用普通的Ruby和HAML就可以做到这一点。
我想在我的HAML模板中包含另一个HAML文件。但是我还没有找到一个好的-或者真正有用的-方法来做这件事。
例如,我有这两个HAML文件:
documents.haml
%html
%body
= include(menu.haml) body
%article …
menu.haml
%ul
%li
%a whatever …
Include显然不是解决这个问题的方法。但它很好地描述了我在这个例子中试图实现的目标。
发布于 2011-03-26 03:06:29
我以前也这样做过,只是为了一个简单的模板生成器。最简单的方法是只在父对象中呈现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方法。
发布于 2011-03-26 05:46:12
对于这些事情,我完全推荐使用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一样。至于分音,David已经描述了一种简单而好的方法。
但实际上,如果您正在编写的内容将通过HTTP提供服务,我建议您看看Sinatra,它已经提供了模板,并且具有您所能想象到的最简单的请求路由。
发布于 2013-04-21 04:01:56
我用David Richards发布的指令以一种串联的方式获得了巨大的成功,没有变量,就像这样:
= Haml::Engine.new(File.read('/Volumes/Project/file_to_include.haml')).render
显然有一种更优雅的方式。但是对于那些只想包含一两个文件的人来说,这应该可以很好地工作。这是一个缺点,所有使用这些包含的基本文件都必须在对后者进行一些更改后重新编译。如果环境允许的话,使用php include可能是值得的。
https://stackoverflow.com/questions/5436769
复制相似问题