在Rails之外的HAML中呈现HAML局部视图

9
我正在使用HAML为网站生成一些静态HTML页面,并希望将常见的组件拆分成可以包含在多个页面中的部分,就像在Rails中一样。但是我不想使用整个Rails堆栈来实现这一点,因为这似乎有点过度。

我在互联网上搜索了一下,但没有找到比以下方式更好的方法:

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

有没有更好的方法在HAML中包含所谓的partials?是否有我错过的现有过滤器或命令?
5个回答

6
最好将Haml和Sass与用于构建静态网站的工具结合使用。以下是一些链接: 我正在使用 Jekyll 编写我的博客,但如果您不是在构建博客,则可能不适合您的需求。

虽然Jekyll看起来很不错,但它基本上是为博客而设计的。StaticMatic似乎正是我想要的。我正在考虑自己实现类似的东西(即使用Erb作为Haml模板的预处理器/后处理器,就像C编译器一样工作)。 - Dominik Grabiec

3

糟糕,你说得对 - 没有内置的方法。我已经使用了带有haml命令行的辅助程序,但总是输出已经格式化为HTML的内容。

我最好的建议是编写一个partial()方法并要求它。看起来你已经开始走这条路了。我建议任何编写此类函数的人考虑以某种方式保留原始绑定。 Haml :: Helpers#capture_hame似乎是实现这一点最简单的方法。

如果执行速度是一个问题,那么缓存一些解析模板可能也是一个好主意,就像Merb一样。

如果有人确实编写出了一些代码,请将其放在GitHub上,并在此处发表评论。


1

我刚刚注意到,如果你想传递你的本地变量,你必须在“haml :content”语句中添加“:locals => locals”。 - AxelTheGerman

0

我也遇到了同样的问题。我需要生成一些 HTML 片段来优化服务器响应,但是这些片段包含了很多计算(用于绘制图形),每当用户发送请求时都会进行不必要的操作。

由于我的视图已经被分成了几个 Haml 局部视图,我希望能够重用它们来生成 HTML 文件。

我的第一个尝试是使用 Haml 引擎,但是当我尝试渲染其他局部视图以及应用程序助手的一些功能时,它并没有起作用。

最终,我找到了一个解决方案,即通过在我想要创建 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文件。这对我很有效,也许对你有所帮助。


0
所有的解决方案对于我的目的来说都显得笨重,尽管我试图做基本相同的事情。这是一个我编写的 Ruby 脚本,它几乎什么也没做——使用 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


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