我在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']}
答案 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应检查脚本行是否确实在下面的行缩进时启动了一个块,创建了一个更具信息性的错误,但目前它没有。