在不存在的行上出现“语法错误,意外的keyword_ensure”

时间:2013-04-20 17:20:49

标签: ruby-on-rails haml

我在haml模板上收到错误:syntax error, unexpected keyword_ensure, expecting $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']}

1 个答案:

答案 0 :(得分:1)

问题是由以下行引起的:

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

%tr不应缩进,您应该将其向后移动(以及在其下方缩进的线条)以与上面的-player ...线对齐。

要了解创建此错误的原因,我们需要了解Haml如何解析脚本。当脚本行在其下面有缩进的部分时,Haml假定它是一个应作为脚本的一部分传递的块,并生成包含生成的end语句的相应代码。例如,这个Haml:

- @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语句。例如,Haml

- a_variable = just_set_the_var
  %li= thing

生成以下Ruby:

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

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

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