Rails视图中的Unicode字符导致gem rack-google-analytics失败

时间:2012-03-30 13:18:38

标签: unicode utf-8 ruby-on-rails-3.1 google-analytics actionview

我最近试图对我的观点进行更新并替换香草星号“*”字符,这意味着用unicode黑色星“★”代表一个明星(U + 2605,“&#x2605”; “&#9733”; 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恢复了之前的更改(用星号替换星号是相关提交中唯一的更改),我的Google Analytics跟踪代码再次正常运行,我的脚本,正文和html标记都有自己的正确的结束标签。

我的问题有两个。

  1. 如何在不吃掉代码结束的情况下将星形字符添加回我的视图?
  2. 我认为在Rails 3.1中开箱即用支持UTF-8,为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

我没有特别看到谷歌分析的这个问题,但一般来说,如果您的Rails源文件包含Unicode字符而没有

,您将收到错误
# encoding: UTF-8  

排在最前面。仔细检查您的HAML文件是否实际编码为UTF-8而不是任何奇怪的UTF-16或非Unicode格式,然后将此标记添加到顶部,看看是否能解决问题。您也可以尝试在您的environment.rb中设置Haml :: Template.options [:encoding] =“utf-8” - afaik它应该是默认值,但可以在某处覆盖。

Rails 3.1支持开箱即用的Unicode,但除非您要求,否则不会在其代码中容忍Unicode。另请注意,某些数据库驱动程序仍然不完全支持Unicode。

答案 1 :(得分:0)

在我的头撞墙后几天,并在我的Rails应用程序中添加了一些“编码:UTF-8”的几乎所有文件,我决定尝试使用html代码&#x2605 。首先,我去了可靠的HTML2HAML converter。它告诉我html代码&#x2605以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)}" %>&#x2605;