【问题标题】:HAML special case indentation with if statements带有 if 语句的 HAML 特殊情况缩进
【发布时间】:2013-10-28 23:36:21
【问题描述】:

所以我有以下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 语句中。具体来说,它们应该与7.times do |i| 下方的tr 对齐,因为haml 强制缩进的方式我似乎无法做到这一点。我想知道 HAML 是否有某种覆盖以允许某种向后缩进。如果这有意义的话。

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

【问题讨论】:

    标签: ruby-on-rails haml


    【解决方案1】:

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

    • 您想从 0 迭代到 6。

    • 您想根据@date 为每一天创建一组行。首先你输出一个包含日期的标题行。

    • 然后您想在@available_times 中查找当天的条目。请注意,我看到的第一个问题 - 此逻辑与上面的 %tr 缩进在同一级别,因此任何作为此逻辑结果输出的 %td 元素都不会有周围的 %tr我假设你打算在这里输出一个%tr,包围%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
    

    也许我猜得太远了,您真的不希望在 if 中出现 %tr,并且您希望导师单元格与包含日期的 %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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2012-05-18
      • 2011-02-27
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多