我最近试图更新我的视图,并将香草星号"*"字符替换为unicode black star"★"(U+2605,"★";"★";0xE2 0x98 0x85(e29885))。当我在适当的视图中将字符添加到字符串中时,一切似乎都很好。其中一个视图如下所示。
_recent_updates.html.haml
%table.tablesorter#home
%thead
%tr#header
%th#year Year
%th#name Player Name
%th#position Position
%th#school School
%th#stars Stars
%tbody
- @recent_commits.each do |rc|
%tr{:class => cycle("odd", "even")}
%td#class= rc.player.year
%td#name= link_to display_name(rc.player), player_path(rc.player.slug)
%td#position= Position.find(rc.player.position_id).abbr if rc.player.position_id
%td#school= link_to rc.school.name, school_path(rc.school.slug)
%td#stars= "#{display_star(rc.player.vc_star_rating)}★"
我发布了更新并继续我的业务。几天后,我查看了谷歌分析,了解该网站的流量情况,发现流量急剧下降,几乎为零。我做了一些检查,因为我知道在这段时间里网站有很多流量,并意识到我的谷歌分析代码有问题。当我在生产中查看页面的源代码时,我看到了以下内容。
<--! ...My Page Contents -->
<script type="text/javascript">
if (typeof gaJsHost == 'undefined') {
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-XXXXXXXX-1");
pageTracker._trackPageview();
} catch(err) {}</scr
unicode字符消耗的额外字节似乎没有被计算在内,因此它们实际上占用了我的页面底部,导致页面突然结束。我应该看到的是脚本标签应该已经结束了,还有正文和html标签的结束
<--! ... My Page Contents -->
<script type="text/javascript">
if (typeof gaJsHost == 'undefined') {
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-XXXXXXXX-1");
pageTracker._trackPageview();
} catch(err) {}</script>
</body>
</html>
我从git恢复到以前的更改(用星号替换星号是提交中唯一有问题的更改),我的谷歌分析跟踪代码再次正常工作,我的脚本、body和html标签都有相应的结束标签。
我的问题有两个方面。
- 如何在不吃掉代码末尾的情况下将星形字符添加回视图
- 我认为Rails 3.1中支持UTF-8,那么为什么会出现这种情况呢
我没有在Google Analytics中看到这个问题,但通常情况下,如果Rails源文件包含Unicode字符而没有,则会出现错误
# encoding: UTF-8
顶部的线条。仔细检查您的HAML文件是否实际编码为UTF-8,而不是像UTF-16或非Unicode格式那样奇怪的格式,然后将此标记添加到顶部,看看这是否解决了问题。您也可以尝试在您的环境中设置Haml::Template.options[:encoding]="utf-8".rb-afaik它应该是默认值,但可能会在某个地方被覆盖。
Rails3.1支持开箱即用的Unicode,但除非你要求,否则它的代码中不能包含Unicode。还要注意,一些数据库驱动程序仍然不完全支持Unicode。
几天后,我的Rails应用程序中几乎每个文件都添加了一些"编码:UTF-8"变体,我决定尝试使用html代码★
。首先,我使用了可靠的HTML2HAML转换器。说明html代码★
在haml中被转换为★
。所以我尝试了一下,得到了一个讨厌的小ISE消息。我尝试了其他几种变体,直到最后我偶然发现了一个解决方案。
我创建了一个基于erb的部分_star.html.erb
,我从_recent_updates.html.haml
文件中调用它,专门用于渲染星形。一旦我这样做了,一切都变得明朗起来,就像一种魅力。
我仍然不确定haml发生了什么,但我希望有比我更聪明的人能弄清楚。
最后一行更新:
_recent_updates.html.haml
%table.tablesorter#home
%thead
%tr#header
%th#year Year
%th#name Player Name
%th#position Position
%th#school School
%th#stars Stars
%tbody
- @recent_commits.each do |rc|
%tr{:class => cycle("odd", "even")}
%td#class= rc.player.year
%td#name= link_to display_name(rc.player), player_path(rc.player.slug)
%td#position= Position.find(rc.player.position_id).abbr if rc.player.position_id
%td#school= link_to rc.school.name, school_path(rc.school.slug)
%td#stars
= render 'star', :rc => rc
我的新部分
_star.html.erb
<%= "#{display_star(rc.player.vc_star_rating)}" %>★