在Rails之外的HAML中渲染HAML部分

时间:2009-09-06 18:02:55

标签: ruby haml

我正在使用HAML为网站生成一些静态html页面,而我想要将常用组件拆分为可以包含在多个页面中的部分,就像在Rails中一样。但是我不想使用整个Rails堆栈来执行此操作,因为它看起来有点矫枉过正。

我在互联网上环顾四周,但没有找到任何东西,比仅仅做一些事情更好:

Haml::Engine.new(IO.read("header.haml")).render

是否有更好的方法在HAML中包含所谓的部分内容?我缺少的现有过滤器或命令?

5 个答案:

答案 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文件。 这对我有用,也许它也可以帮到你。