0

所以我有以下haml代码:

.row
    .col-sm-12
        %h2
            = @title
        %h3 This Week
        %table
            %tr
                %td
                    %strong Date
                %td
                    %strong
                        = @available__or_tutor
            - 7.times do |i|
                %tr
                    %td{:rowspan => 3}
                        = @date = @date + 1.days
                - @available_times.each do |available_time, index|
                    - if i == available_time.day
                        - if index == 0 
                            %td
                                = @tutor_var
                                %img{:src => "/assets/tick.png", :style => "width: 30%;"}
                    - else
                    %tr
                        %td
                    %tr
                        %td

我想要决赛

%tr
    %td
%tr
    %rd

嵌套在 else 语句中。具体来说,它们应该与tr下面7.times do |i|的对齐,因为 haml 强制缩进的方式我似乎无法做到这一点。我想知道 HAML 是否有某种覆盖来允许某种向后缩进。如果这是有道理的。

不太理想的解决方案当然是在 html/erb 中添加一个部分,然后为该位转储 haml。

4

1 回答 1

0

通常,如果您想做的事情在 HAML 中是不可能做的,这只是意味着您需要考虑另一种方法。我会尝试解释你的问题,如果我在几英里之外,你可以告诉我。

  • 您想从 0 迭代到 6。

  • 您想根据 . 为每一天制作一组行@date。首先,您输出一个包含日期的标题行。

  • 然后你想在@available_times那天找到一个条目。注意,我看到的第一个问题——这个逻辑与上面的缩进在同一级别%tr,所以任何%td作为这个逻辑结果输出的元素都没有环绕%tr我将假设您打算在%tr此处输出 a ,围绕%td.

  • 从您的问题来看,下一部分是混乱开始的地方。如果在@available_times 中没有找到合适的条目,我认为你想输出两个空白行。但是没有办法突然退出等级制度。

所以这是我的建议。您需要先决定是否在 @available_times 中有条目,然后在正确的点进行分支,例如

- 7.times do |i|
    %tr
        %td{rowspan: 3}= @date = @date + 1.days
    - if @available_times.each_with_index.any? { |available_time, index | i == available_time.day && index == 0 }
        %tr
            %td
                = @tutor_var
                %img{src: "/assets/tick.png", style: "width: 30%;"}
  - else
      %tr
          %td
      %tr
          %td

也许我的猜测太过分了,而您真的不希望其中有一个%trif并且您希望导师单元格出现在%td{rowspan: 3}包含日期的同一行中。如果是这种情况,您将执行更高级别的评估,例如

- 7.times do |i|
    - if @available_times.each_with_index.any? { |available_time, index | i == available_time.day && index == 0 }
        %tr
            %td{rowspan: 3}= @date = @date + 1.days
            %td
                = @tutor_var
                %img{src: "/assets/tick.png", style: "width: 30%;"}
    - else
        %tr
            %td
        %tr
            %td

请注意,可以缩短目前的评估。由于您一直在检查index == 0,因此您每次都可以检查列表中的第一个条目(这就是您的意思吗?除了第一个之外,@available_times 列表中的任何条目都不会通过逻辑。)

if @available_times.first.day == i

另一个注意事项:您也可以打开这个:

  - else
      %tr
          %td
      %tr
          %td

进入这个:

  - else 
      - 2.times do
          %tr
              %td

(编辑:我注意到您使用四个空格进行缩进,我改用相同的。我通常发现如果我使用两个空格,我犯的错误更少,仅此而已。)

于 2013-10-29T00:13:49.407 回答