HAML特殊情况缩进与if语句

时间:2013-10-28 23:36:22

标签: ruby-on-rails haml

所以我有以下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。

1 个答案:

答案 0 :(得分:0)

通常,如果你想做的事情在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

也许我猜得太远了,你真的不希望%tr内有if,你希望教师单元出现在与{%td{rowspan: 3}相同的行中1}}包含日期。如果是这种情况,您可以将评估提高一级,例如

- 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

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