使用块作为参数呈现嵌套的HAML模板

时间:2015-07-29 13:12:24

标签: ruby sinatra haml

我目前正在使用辅助方法在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中完成(以及如何或为什么不这样做)?

0 个答案:

没有答案