Подтвердить что ты не робот

Rails 4 turbolinks с Google Analytics

Мне интересно, как лучше всего реализовать код отслеживания Google Analytics вместе с турбо-связью в Rails 4. Будет ли нормальный сниппет работать? Я также видел драгоценные камни для этого, но я не уверен, что он делает.

4b9b3361

Ответ 1

Я думаю, что лучше использовать новую универсальную аналитику (из файла analytics.js).

Универсальное решение для аналитики

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', "#{GA_UA}", "#{GA_URL}");
  ga('send', 'pageview');

И затем, когда вы хотите отправить событие, например, вы можете использовать

<script> ga('send', "event", "#{category}", "#{action}", "#{label}", "#{count}"); </script>

Будьте осторожны, чтобы сделать этот код в теле, а не в голове. Турбо-ссылки заменяют только тело.

И будьте осторожны:

1) GA_URL должен соответствовать URL-адресу ваших страниц

2) События отображаются в режиме реального времени, но на вкладке событий они появляются только после 24h +

3) Свойство вашей учетной записи должно быть "универсальным" для этого решения для работы

Документы Universal Analytics:

https://support.google.com/analytics/answer/2790010?hl=en&ref_topic=2790009

Ответ 2

Мне нравится решение vladCovaliov, потому что кажется, что большинство новых учетных записей используют Universal Analytics по умолчанию (что также лучше, на мой взгляд). Тем не менее, я думаю, что этот ответ должен сочетаться с другими предложениями, которые комментируют начальную страницу, использовать событие page:change и отслеживать просмотры страниц, а не события.

Например, в <head>:

<% if Rails.env.production? %>
  <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-XXXXXXXX-X', 'auto');
    //ga('send', 'pageview');
  </script>
<% else %>
  <script>
    function ga () {
      var params = Array.prototype.slice.call(arguments, ga.length);
      console.log("GoogleAnalytics: " + params);
    };
  </script>
<% end %>

И затем в файле js, который вы загрузили через конвейер активов:

$(document).on('page:change', function() {
  ga('send', 'pageview', window.location.pathname);
});

Это приведет к записи просмотра страницы для каждой загружаемой страницы с помощью Turbolinks или без нее. Обратите внимание, что требуется window.location.pathname, иначе вы можете получить URL-адрес первой страницы, загруженной для всех последующих загрузок страниц. (Это также дает вам приятное место для редактирования URL-адреса, если вы хотите, например, выделить сегменты маршрута :id из URL-адресов RESTful.)

Вы также можете легко вызвать:

ga('send', "event", category, action, label, count);

Сообщать о событиях для других интересных событий javascript на вашем сайте.

Ответ 3

Я пошел с другим подходом, который я видел на каком-то веб-сайте, но это кажется разумным.

Добавьте GA в свой заголовок, как обычно, но с небольшой модификацией комментирования события trackPageview, которое происходит автоматически.

<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-FOOBAR']);
  //_gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>

Затем добавьте это где-нибудь в свой body, потому что тело перезагружается для turbolinks.

<% if Rails.env.production? %>
  <script>_gaq.push(['_trackPageview']);</script>
<% end %>

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

Ответ 4

Быстрый взгляд на источник показывает, что единственное, что делает этот камень, это добавить некоторый javascript в конвейер ресурсов

# google-analytics-turbolinks/lib/assets/javascripts/google-analytics-turbolinks.js.coffee
if window.history?.pushState and window.history.replaceState
  document.addEventListener 'page:change', (event) =>

    # Google Analytics
    if window.ga != undefined
      ga('set', 'location', location.href.split('#')[0])
      ga('send', 'pageview')
    else if window._gaq != undefined
      _gaq.push(['_trackPageview'])
    else if window.pageTracker != undefined
      pageTracker._trackPageview();

Вот и все. Вы можете использовать драгоценный камень или добавить что-то вроде этого фрагмента кода вручную в свои javascript-активы.

Ответ 5

Я ценю ответ scottwb, но, к сожалению, он не работает с Rails 5. В Rails 5 события Turbolinks были переименованы. Событие "page: change" было переименовано в "turbolinks: load". Вот почему его пример больше не работает.

Вы можете найти обзор того, как они были переименованы здесь: https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee

Так как это заняло у меня некоторое время, чтобы понять, я публикую правильную реализацию Rails 5 для всех, кто идет за мной.

Поместите следующий код в свой <head>

  <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-XXXXXXXX-X', 'auto');
    //ga('send', 'pageview'); //moved to an asset file because of turbolinks
  </script>

И затем в файле js (например. application.js) в конвейере вашего ресурса:

$(document).on('turbolinks:load', function() {
   ga('send', 'pageview', window.location.pathname + window.location.search);
});

Не забудьте заменить "UA-XXXXXXXX-X" на свой идентификатор Google Analytics.

Ответ 7

Мы просто взяли стандартный фрагмент, предоставленный Google, переведем его на CoffeeScript, а затем изменили последнее действие, поэтому оно связано как с событиями "ready" и "page: load". Мы также добавили условный оператор только для отправки данных, если текущий посетитель не находится у администратора (поэтому наши данные остаются как можно более чистыми).

((i, s, o, g, r, a, m) ->
  i["GoogleAnalyticsObject"] = r
  i[r] = i[r] or ->
    (i[r].q = i[r].q or []).push arguments
    return

  i[r].l = 1 * new Date()

  a = s.createElement(o)
  m = s.getElementsByTagName(o)[0]

  a.async = 1
  a.src = g
  m.parentNode.insertBefore a, m
  return
) window, document, "script", "//www.google-analytics.com/analytics.js", "ga"
ga "create", 'UA-XXXXXXXX-XX', "yourdomain.com"

$(document).on 'ready page:load', ->
  ga "send", "pageview", window.location.pathname unless $('body').data('admin') is true

Ответ 8

В соответствии с этим сайтом вам нужно только внести небольшую модификацию. Проблема с Turbolinks заключается в том, что она обновляет только часть веб-сайта, поэтому Google Analytics часто не видит, что страница изменилась. Таким образом, вы должны уведомить об этом вручную, добавив следующий CoffeeScript в файл в папке assets/javascript:

$(document).on 'page:change', ->
  if window._gaq?
    _gaq.push ['_trackPageview']
  else if window.pageTracker?
    pageTracker._trackPageview()

ПРИМЕЧАНИЕ: это не мой код, он берется непосредственно с ранее связанного веб-сайта