我正在使用HAML为网站生成一些静态html页面,而我想要将常用组件拆分为可以包含在多个页面中的部分,就像在Rails中一样。但是我不想使用整个Rails堆栈来执行此操作,因为它看起来有点矫枉过正。
我在互联网上环顾四周,但没有找到任何东西,比仅仅做一些事情更好:
Haml::Engine.new(IO.read("header.haml")).render
是否有更好的方法在HAML中包含所谓的部分内容?我缺少的现有过滤器或命令?
答案 0 :(得分:6)
最好将haml&使用工具构建静态网站。这是一些链接:
我正在为我的博客使用jekyll,但如果你没有建立博客,那可能不适合你的需求。
答案 1 :(得分:3)
Darn,你是对的 - 没有内置方式。我使用了haml
命令行的帮助程序,但总是那些输出已经是HTML格式的帮助程序。
我最好的建议是编写一个partial()
方法并要求它。看起来你已经开始走这条路。我会建议任何人写这样的函数考虑以某种方式保持原始绑定。 Haml::Helpers#capture_hame看起来是实现这一目标的最简单方法。
如果执行速度是个问题,那么以与 Merb 相同的方式缓存一些已解析的模板也可能是个好主意。
如果有人确实使用了某些代码,请将其放在GitHub上并在此处发表评论。
答案 2 :(得分:1)
我终于找到了我要找的东西,所以我想我会和你分享我的发现。您可以首先使用与haml相同的语法 - http://www.semicomplete.com/blog/geekery/partials-in-haml-in-sinatra.html
/views/file.haml
%h3 Title
%div= haml :content, :layout => false
/views/content.haml
%p your content here
答案 3 :(得分:0)
所有解决方案对我来说似乎都很笨重,尽管我试图基本上做同样的事情。这是我编写的一个非常小的红宝石脚本 - 评估Haml可以选择在任何你喜欢的地方坚持= partial "test.haml"
。它尝试找到一个部分文件需要很少的逻辑。
require 'haml'
def find filename
return filename if File.exists? filename
path = File.dirname ARGV[0]
filename = path+"/"+filename
return filename if File.exists? filename
throw "Could not find file."
end
def partial filename
source = File.read(find(filename))
engine = Haml::Engine.new(source)
engine.render(binding)
end
puts partial ARGV[0]
你这样执行它:ruby hamlize.rb input.haml> output.html
答案 4 :(得分:0)
我遇到了同样的问题。我需要生成一些html片段来优化服务器响应,一旦这个片段有很多计算(用于绘制图形),并且每次用户执行请求时它都会不必要地执行所有操作。
一旦我将视图分区为几个haml partials,我想重用它来生成html文件。
我的第一种方法是尝试使用Haml引擎,但是一旦我有部分渲染应用程序助手的其他部分和一些功能,它就没有用了。 Finality我找到了一个解决方案,通过在我想创建一个html文件的模型中创建一个函数来传递(to_html)这就是它:
def to_html
ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper
File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file|
file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
:partial => 'partial_folder/partial',
:format => :html,
:locals => { :model => self}
)
end
end
这样,我就可以使用已经完成的部分来打印html文件。 这对我有用,也许它也可以帮到你。