【问题标题】:Haml - if-else with different indentationsHaml - if-else 有不同的缩进
【发布时间】:2010-04-21 10:21:50
【问题描述】:

我正在尝试使用 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

这不是我想要的方式。非星期天的%tds 出现在%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 抱怨缩进不当。

最好的方法是什么?

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

【问题讨论】:

    标签: ruby-on-rails indentation haml


    【解决方案1】:

    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 转换为 Array - Range 似乎没有实现 in_groups_of

    【讨论】:

      【解决方案2】:
      %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>
      

      【讨论】:

      • 我相信这只适用于第一行(第一周)。 @dates 包含几个星期,而不仅仅是一个。我想每周放一个 %tr。
      • 你不能以正常的方式在haml中做到这一点。有两种选择。首先,将您的数组切成几周的数组并迭代它们中的每一个,如我的答案所示(这将是我的首选解决方案)。其次,实际手动打印标签: = "" 当你需要它们时(这是一个丑陋的解决方案)。如果您需要第一种方法的示例,我可以画出草图。
      • 我找到了一种使用 in_groups_of 的方法(添加答案)。感谢您的帮助,我真的被这个缩进的东西挡住了。
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签