2

我收到错误消息:语法错误,意外的keyword_ensure,期望在我拥有的haml模板上使用$end,但是它提取的提取的源代码行号超出了文件的末尾。我的代码是:

%span
* click a gamertag to see detailed medal stats

.seperator{ :id => 'medal-stats', :style => 'margin: 20px 0 20px 0;' }

- @sorted_players.each do |player|
  .medal_stats{ :id => "player_medals_#{Digest::MD5.hexdigest(player['Gamertag'])}" }
    %h3
      #{player['Gamertag']}'s Medals

  %table.team-table.table.table-bordered.table-striped.table-hover
    %thead
      %tr
        - @metadata['MedalsMetadata']['MedalClasses'].each do |medal_class|
          %td
            #{medal_class['Name']}

    %tbody
      - player['MedalStats'] = player['MedalStats'].sort_by { |medal| medal['TotalMedals'] }.reverse
        %tr
          - @metadata['MedalsMetadata']['MedalClasses'].each do |medal_class|
            %td
              - player['MedalStats'].each do |medal|
                - if medal['ClassId'] != medal_class['Id']
                  - next

                .medal-entry{ :style => "background-image: ('#{ X343ApiController.asset_url_generator_basic( medal['ImageUrl']['BaseUrl'],
                medal['ImageUrl']['AssetUrl'], 'medium') }');" }
                  #{medal['TotalMedals']}
4

1 回答 1

1

问题是由以下行引起的:

- player['MedalStats'] = player['MedalStats'].sort_by { |medal| medal['TotalMedals'] }.reverse
  %tr

%tr不应该缩进,你应该将它移回(以及它下面缩进的行)以与上面的行-player ...一致。

要了解为什么会产生这个错误,我们需要看看 Haml 是如何解析脚本的。当脚本行下面有一个缩进的部分时,Haml 假定它是一个应该作为脚本的一部分传递的块,并生成适当的代码,包括生成的end语句。例如这个哈姆尔:

- @things.each do |thing|
  %li= thing

生成看起来像的 Ruby

 @things.each do |thing|
_hamlout.buffer << "<li>#{thing
}</li>\n";end;

第一行 ( @things.each do |thing|) 直接从 Haml 源复制而来,但对应end的是由 Haml 生成的。还要注意它end是如何放在尾随行的,因此它与 Haml 中的行不匹配,并且错误似乎来自源代码末尾之外。

如果脚本行没有开始一个块,Haml 不会注意到并仍然假定一个块已被打开并生成该end语句。例如哈姆

- a_variable = just_set_the_var
  %li= thing

生成以下 Ruby:

 a_variable = just_set_the_var
_hamlout.buffer << "<li>#{a_variable
}</li>\n";end;

第一行是直接从 Haml 复制的,由于它不包含 a do |...|,因此endHaml 生成的 不匹配,从而产生语法错误。

可以说,当以下行缩进时,Haml 应该检查脚本行是否确实开始了一个块,从而创建了一个更具信息性的错误,但目前它没有。

于 2013-04-20T18:23:42.523 回答