我目前正在使用辅助方法在Sinatra中渲染HAML嵌套的部分/模板。为了简单起见,我只写了一个最小的例子,但当然我的代码要大得多。关键是我要分析inner_template
而不是复制/粘贴到处:
require 'sinatra'
require 'haml'
helpers do
def inner_template(&block)
haml_tag('div', :class => 'title', &block)
end
end
get '/' do
haml :index
end
__END__
@@ layout
%html
= yield
@@ index
%div.div1
- inner_template do
%span Item 1
- inner_template do
%span Item 2
这样可以正确呈现页面:
<html>
<div class='div1'>
<div class='title'>
<span>Item 1</span>
</div>
<div class='title'>
<span>Item 2</span>
</div>
</div>
</html>
问题是我的真实生活inner_template
方法有一个随之而来的标签数量,我发现它非常不优雅(当我必须编辑它时很麻烦)。我还希望将所有最内部的块(我的项目)保留在同一页面上,否则我最终会得到几十个小文件,这将是一个令人头疼的问题。
我的印象是,由于我可以使用仅使用haml_tag
方法的辅助方法,因此必须有一种方法可以使所有内容都在纯HAML中工作。但我无法弄清楚如何正确地做到这一点。例如,如果我只是尝试显而易见的方式:
require 'sinatra'
require 'haml'
get '/' do
haml :index
end
__END__
@@ layout
%html
= yield
@@ index
%div.div1
= haml :inner_template do
%span Item 1
= haml :inner_template do
%span Item 2
@@ inner_template
%div.title
= yield
这不起作用,inner_template在其“内部”块之后呈现(至于什么产生值1,我不知道):
<html>
<div class='div1'>
<span>Item 1</span>
<div class='title'>
1
</div>
<span>Item 2</span>
<div class='title'>
1
</div>
</div>
</html>
我尝试了很长的黑客列表,我也尝试使用content_for
或类似的解决方案(似乎只适用于旧版本的Sinatra),但我找不到符合我的方法的示例(可能暗示它是不可能的)。并且在调用haml
时看起来块根本没有传递给HAML渲染器。
所以我想知道这是否可以在纯HAML中完成(以及如何或为什么不这样做)?