2012-02-12 3 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

これはhamlでは不可能だと思います。あなたはあなたのデータ構造を変更したいかもしれません。 – thammi

+0

私はサーバー側でデータを収集していますが、データはすでに日付順にソートされています。私は、次の構造を渡さなければならないことは愚かなようです:[date => [items]]。私が私の後戻りになる解決策を得ることができない場合 – aar

答えて

9

を使用しています:)

- @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のエレガンスを抱きしめてください。それがERBのようにハムルを書かないでください。

+0

ありがとう。私はそれが私がそれを得ることができるようにきれいだと思います。私はサーバー側でそれを整理することを考えていましたが、これは私にはよりきれいなものであり、perfが影響を受けるとは思いません。 – aar

+0

これは素晴らしいことです - それはちょうど約12行の定型文を切り捨てました。 –