【问题标题】:Unicde Character in Rails View causing gem rack-google-analytics to failRails 视图中的 Unicode 字符导致 gem rack-google-analytics 失败
【发布时间】:2012-04-14 04:28:36
【问题描述】:

我最近试图更新我的观点,并用 unicode 黑星“★”(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 字符消耗的额外字节没有得到解释,因此它们有效地吃掉了我的页面底部,导致它突然结束。我应该看到的是 script 标签应该已经结束,以及 body 和 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. 我认为 UTF-8 在 Rails 3.1 中是开箱即用的,那么为什么会这样呢?

【问题讨论】:

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


    【解决方案1】:

    在我的头撞墙几天之后,我在我的 Rails 应用程序中的每个文件中添加了一些“编码:UTF-8”的变体,我决定尝试使用 html 代码&amp;#x2605。首先我去了值得信赖的HTML2HAML converter。它告诉是html代码&amp;#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;
    

    【讨论】:

      【解决方案2】:

      我没有特别看到 Google Analytics 的这个问题,但一般来说,如果您的 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。

      【讨论】:

      • 不幸的是,这些都没有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2021-01-18
      • 2012-05-21
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多