2012-02-12 54 views
3

我正在遍历一组项并将它们显示在嵌套在div中的列表中。目标是每天都有一个div,并在每个div内显示当天的项目。有条件地关闭HAML中的标记

我该如何在HAML中做到这一点?我不认为我可以(或应该)有条件地关闭并创建一个新的标签,就像我可以在erb中一样。

我想:

- @items.each do |item| 
    - if item date is diff from previous make a new container 
    .container 
     %h2 #{item.date} 
     = yield_content :display_item item 
    - else 
    = yield_content :display_item item 

但是,这将创建下列:

<div class="container"> 
<h2>01/28/2012</h2> 
     <ul> 
      <li> 
       ... item 
     </li> 
     </ul> 
</div> 
     <li> 
     ...item 
     </li> 

但我想在同一div其他项目。 我使用的红宝石,辛纳屈(包括content_for助手)

+0

我认为这是不可能的哈姆。您可能想要更改您的数据结构。 – thammi 2012-02-12 22:28:32

+0

我正在收集服务器端的数据,它已经按日期排序。看起来很愚蠢,我不得不将视图传递给以下结构:[date => [items]]。如果我不能得到一个解决方案,这将是我的后备 – aar 2012-02-13 01:01:17

回答

9

的答案是使用更多更好的Ruby :)

- @items.group_by(&:date).each do |date,items| 
    .container 
    %h2= date 
    - items.each do |item| 
     = yield_content :display_item item 

Enumerable#group_by文档的更多细节。

可能close and re-open the containers and headers as you were thinking,但是这是一个可怕的,难以维护的黑客,我会建议反对。拥抱Ruby和Haml的优雅;不要把Haml写成ERB。

+0

谢谢。我认为这是尽可能干净,因为我可以得到它。我想在服务器端组织它,但这对我来说更清洁,我不认为perf会受到影响。 – aar 2012-02-15 20:50:48

+0

太棒了 - 只是剪出大约十几行样板。 – 2015-09-24 18:02:29