Символ Unicde в представлении Rails приводит к сбою gem rack-google-analytics - PullRequest
0 голосов
/ 30 марта 2012

Недавно я пытался обновить мои представления и заменить символ звездочки "*" ванили, который должен был представлять звезду с черной звездой в юникоде "★" (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)}★"

Я выпустил обновление и продолжил свое дело.Пару дней спустя я проверил Google Analytics, чтобы увидеть, как трафик идет на сайт, и заметил резкое падение почти до нуля.Я провел некоторую проверку, так как знал, что в этот период времени на сайт было много трафика, и понял, что с моим кодом Google Analytics что-то не так.Когда я посмотрел исходный код страницы в работе, вот что я увидел.

<--! ...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 снова работает нормально, и все мои теги script, body и html имеют свои закрывающие теги.

У меня вопрос в два раза.

  1. Как мне добавить звездный символ обратно в мое представление, не съедая конец моего кода?
  2. Я думал, UTF-8 была поддержана из коробки в Rails 3.1, так почему это происходит?

Ответы [ 2 ]

1 голос
/ 31 марта 2012

В частности, я не видел этой проблемы с Google Analytics, но в целом вы получите ошибки, если ваши исходные файлы Rails содержат символы Unicode без

# encoding: UTF-8  

строка вверху. Дважды проверьте, что ваш HAML-файл на самом деле закодирован как UTF-8, а не как-нибудь странно, как UTF-16 или не-Unicode формат, затем добавьте этот тег вверху и посмотрите, решит ли это проблему. Вы также можете попробовать установить Haml :: Template.options [: encoding] = "utf-8" в вашем environment.rb - afaik это должно быть по умолчанию, но может быть где-то переопределено.

Rails 3.1 поддерживает Unicode из коробки, но не допускает Unicode внутри его кода, если вы не попросите об этом. Также обратите внимание, что некоторые драйверы баз данных все еще не полностью поддерживают Unicode.

0 голосов
/ 03 апреля 2012

После нескольких дней ударившись головой о стену и добавив некоторые варианты «кодировки: UTF-8» практически ко всем файлам в своем приложении на Rails, я решил попробовать использовать HTML-код &#x2605.Сначала я пошел в надежный HTML2HAML конвертер .Сказано, что HTML-код &#x2605 конвертируется в \★ в хамле.Так что я попробовал это и получил неприятное маленькое сообщение ISE.Я попробовал несколько других вариантов, пока, наконец, не наткнулся на решение.

Я создал частичную _star.html.erb на основе эрб, которую я вызвал из моего файла _recent_updates.html.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;
...