Haml - if-else有不同的缩进

时间:2010-04-21 10:21:51

标签: ruby-on-rails indentation haml

我正在尝试使用Rails和Haml呈现日历。

使用的日期来自名为@dates的变量。它是Date范围,包含要在日历上显示的第一天和最后一天。第一天总是星期天,最后一天总是星期一。

我打算使用HTML表格呈现一个典型的日历,每个工作日有一列(星期日将是一周的第一天)。

所以,我需要在星期日放一个%tr后跟一个%td,但剩下的时间我只需要一个%td

我在Haml建模时遇到了麻烦。这似乎需要不同级别的缩进,这是它不喜欢的东西。这是我失败的尝试:

%table
  %tr
    %th= t('date.day_names')[0] # Sunday
    %th= t('date.day_names')[1]
    %th= t('date.day_names')[2]
    %th= t('date.day_names')[3]
    %th= t('date.day_names')[4]
    %th= t('date.day_names')[5]
    %th= t('date.day_names')[6] # Monday
  -@dates.each do |date|
    - if(date.wday == 0) # if date is sunday
      %tr
        %td=date.to_s
    - else
      %td=date.to_s

这不符合我的要求。非星期日的%td次出现在%tr

之外
      <tr>
        <td>2010-04-24</td>
      </tr>
      <td>2010-04-25</td>
      <td>2010-04-26</td>
      <td>2010-04-27</td>
      <td>2010-04-28</td>
      <td>2010-04-29</td>
      <td>2010-04-30</td>
      <tr>
        <td>2010-05-01</td>
      </tr>
      <td>2010-05-02</td>
      <td>2010-05-03</td>
      ...

我尝试在else添加两个空格,但后来Haml抱怨不正确的缩进。

最好的方法是什么?

注意:我对使用无序列表呈现日历不感兴趣。请考虑使用表作为问题的约束之一。

2 个答案:

答案 0 :(得分:4)

Evgeny的评论让我走上正轨。

这是一个有效的解决方案,使用rails in_groups_of(链接已经死了):

%table(cellspacing="0" cellpadding="0")
  %tr
    %th= t('date.day_names')[0]
    %th= t('date.day_names')[1]
    %th= t('date.day_names')[2]
    %th= t('date.day_names')[3]
    %th= t('date.day_names')[4]
    %th= t('date.day_names')[5]
    %th= t('date.day_names')[6]

  - @dates.to_a.in_groups_of(7) do |week|
    %tr
      - week.each do |day|
        %td=day.to_s

请注意,我必须将Range转换为数组 - 范围似乎没有实现in_groups_of

答案 1 :(得分:1)

%table
  %tr
    %th= t('date.day_names')[0] # Sunday
    %th= t('date.day_names')[1]
    %th= t('date.day_names')[2]
    %th= t('date.day_names')[3]
    %th= t('date.day_names')[4]
    %th= t('date.day_names')[5]
    %th= t('date.day_names')[6] # Monday
  %tr
    -@dates.each do |date|
      %td=date.to_s

这应该给你

<tr>
  <td>2010-04-24</td>
  <td>2010-04-25</td>
  <td>2010-04-26</td>
  <td>2010-04-27</td>
  <td>2010-04-28</td>
  <td>2010-04-29</td>
  <td>2010-04-30</td>
</tr>