0

我最近試圖對我的視圖進行更新,並將本來代表星號的香草星號「*」字符替換爲unicode黑色星號「 ★「(U + 2605,」&#x2605「;」&#9733「; 0xE2 0x98 0x85(e29885))。當我在適當的視圖中將字符添加到字符串中時,一切似乎都很好。其中一種觀點如下所示。Rails視圖中的Unicde角色導致gem rack-google-analytics失敗

_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字符消耗額外的字節下落不明,使他們有效地吃了我的頁面的底部,導致其突然終止。我應該看到的是,腳本標記應該已經結束,以及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> 

我恢復從混帳以前的更改(更換星星星號是在提交討論的唯一的變化),而我的谷歌Analytics跟蹤代碼再正常工作,我的劇本,身體和HTML標籤都有其正確的結束標籤。

我的問題是兩倍。

  1. 如何將明星角色添加到我的視圖中而不會消耗我的代碼的末尾?
  2. 我以爲UTF-8是在Rails 3.1中開箱即用的,所以爲什麼會這樣呢?

回答

1

我還沒有看到有特別谷歌分​​析這個問題,但一般而言,您會得到錯誤,如果你的Rails源文件包含Unicode字符,而無需在頂部的

# encoding: UTF-8 

線。仔細檢查你的HAML文件實際上是否編碼爲UTF-8,而不是UTF-16或非Unicode格式的任何奇怪的東西,然後將這個標籤添加到頂部,看看是否能解決問題。您也可以嘗試在您的environment.rb中設置Haml :: Template.options [:encoding] =「utf-8」,它應該是默認值,但可能會在某處被覆蓋。

Rails 3.1支持開箱即用的Unicode,但除非您提出要求,否則不會在其代碼中容忍Unicode。另請注意,某些數據庫驅動程序仍然不完全支持Unicode。

+0

不幸的是,這些沒有一個幫助。 – 2012-03-31 18:18:46

0

在我的頭撞牆撞了幾天之後,並在我的Rails應用程序的幾乎每個文件中添加了「encoding: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;