为什么HAML认为我在线上有内容并嵌套? (我不)

时间:2016-02-26 00:25:52

标签: haml

我的HAML读到:

%table.screenshots
  %thead
    %trow
      %td{:colspan => 12} Screenshots for #{element.name}
  %tbody
    - screenshots.each do |set|
      %tr
        - set[1].each do |shot|
          - if shot == :blank_cell
            %td{:colspan => set[0]}.twelfth  
          - else
            %td{:colspan => set[0]}.twelfth
              = image_tag(shot[1]) # <= ERROR APPEARS HERE
              - if @redacted
                %h1.blur
                  %span Image blurred in
                  %br
                  %span demo report only
              %p #{shot[0]}

.twelfth之后没有不可见的空格或标签。

为什么我会收到此错误?

Illegal nesting: content can't be both given on the same line as %td and nested within it.

顺便说一下,我跑的时候遇到同样的例外:

haml --debug print.html.haml

2 个答案:

答案 0 :(得分:0)

通过将违规行更改为:

来解决此问题
%td{:colspan => set[0], :class => "twelfth"}

看起来HAML解释器中存在一个错误

答案 1 :(得分:0)

类和标识符(.#)必须位于标记名称之后,并且在任何属性哈希之前。

在你的代码中,问题就在于:

%td{:colspan => set[0]}.twelfth

这被解释为td元素,其colspan属性包含内容.twelfth,在呈现时看起来像这样,如果它本身就是:

<td colspan='7'>.twelfth</td>

但是这行也有嵌套在下面的内容,这是Haml不允许的。

您可以通过在your answer中使用属性哈希中的显式class条目,或者通过在属性哈希前面移动.twelth类说明符来解决此问题,例如这样:

%th.twelfth{:colspan => set[0]}