【问题标题】:Conditionally closing a tag in HAML有条件地关闭 HAML 中的标签
【发布时间】:2012-03-04 10:14:40
【问题描述】:

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

如何在 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 中。 我正在使用 ruby​​、sinatra(包括 content_for 助手)

【问题讨论】:

  • 我认为这在haml中是不可能的。你可能想改变你的数据结构。
  • 我正在服务器端收集数据,它已经按日期排序。我必须通过以下结构来传递视图似乎很愚蠢:[date => [items]]。如果我无法得到一个可以作为我后备方案的解决方案

标签: haml


【解决方案1】:

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

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

更多详情请参阅Enumerable#group_by docs。

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

【讨论】:

  • 谢谢。我认为这是我能做到的最干净的。我正在考虑在服务器端组织它,但这对我来说更清晰,我认为性能不会受到影响。
  • 太棒了——只删掉了十几行样板代码。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多