Как использовать пользовательские события Google Analytics внутри моего контроллера rails? - PullRequest
8 голосов
/ 15 февраля 2012

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

_trackEvent(category, action, opt_label, opt_value, opt_noninteraction)

или

_gaq.push(['_trackEvent', 'Videos', 'Play', 'Gone With the Wind']);

спасибо! И какой из них я должен использовать? EDIT:

Вот как я настроил это на основе предложения:

частичный код отслеживания:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-ACCOUNT']);
  _gaq.push(['_setDomainName', 'sitename.com']);
  _gaq.push(['_trackPageview']);
  <%= render "layouts/ga_events" %>

  (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>

_ga_events.html.erb (я добавил в параметре «значение»)

<% unless session[:events].nil? %>
  <% session[:events].each do |event|%>
     _gaq.push(['_trackEvent', '<%= event[:category]%>', '<%= event[:action]%>', '<%= event[:label]%>', '<%= event[:value]%>']);
  <% end %>
<% end %>

<% session[:events] = Array.new %>

контроллер приложения (добавлено «значение параметра»)

  protected
    # GA event logger
    def log_event(category, action, label = nil, value = nil)
      session[:events] ||= Array.new
      session[:events] << {:category => category, :action => action, :label => label, :value => value}
    end

тестирую его в моем контроллере Tasks:

def create
    @task = @user.tasks.build(params[:task])
    @task.author = current_user unless @user == current_user

    if @task.save
        log_event("Tasks", "Created", current_user.email, "123")
        redirect_back tasks_path, :notice => t('tasks.created')
    else
        redirect_back tasks_path, :alert => @task.errors.full_messages
    end
end

РЕДАКТИРОВАТЬ: здесь мой выходной код GA, похоже, все правильно:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA_CODE']);
  _gaq.push(['_setDomainName', 'SUBDOMAIN']);
  _gaq.push(['_trackPageview']);
       _gaq.push(['_trackEvent', 'Priority', 'Created (day)', 'Label info', '']);



  (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>

Ответы [ 4 ]

18 голосов
/ 15 февраля 2012

Вот как я это делаю, это очень похоже на то, как RoR реализует flash. По сути, на стороне сервера вы сохраняете события, которые в конечном итоге хотите отправить в GA через Javascript. Когда страница в конечном итоге отображается, вы отображаете Javascript для отправки событий и сбрасываете свой магазин.

Итак ...

# application_controller.rb
protected
def log_event(category, action, label)
    session[:events] ||= Array.new
    session[:events] << {:category => category, :action => action, :label => label}
end

.. вызывайте этот метод из отдельных методов контроллера столько раз, сколько пожелаете.

# application.html.erb
<head>
... other stuff...
<!-- Google Analytics -->
<script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', '<%= CONFIG['ga_account_id'] %>']);
    _gaq.push(['_trackPageview']);
    <%= render "layouts/ga_events" %>
</script>

.. и здесь есть частичное упоминание:

# _ga_events.html.erb
<% unless session[:events].nil? %>
  <% session[:events].each do |event|%>
     _gaq.push(['_trackEvent', '<%= event[:category]%>', '<%= event[:action]%>', '<%= event[:label]%>']);
  <% end %>
<% end %>

<% session[:events] = Array.new %>
3 голосов
/ 08 октября 2013

Прыжки на этот suuuuper поздно, но вот действительно быстрый вариант выше. Просто поместите этот код в контроллер, который должен вызвать пользовательское событие:

flash.now[:event] = "<script>_gaq.push(['_trackEvent', '#{category}', '#{action}'])</script>".html_safe

Гораздо короче, чем сессия!

1 голос
/ 05 мая 2012

Все это почти правильно, но Google Analytics не принимает пустую строку, а последний параметр должен быть целым числом .

Поэтому я изменил _ga_events.html.erb следующим образом:

<% unless session[:events].nil? %>
    <% session[:events].each do |event|%>
        <%params=[]%>
        <%params << "'_trackEvent'"%>
        <%params << "'#{event[:category] || "undefined" }'"%>
        <%params << "'#{event[:action] || "undefined" }'" %>
        <%params << "'#{event[:label]}'" if !event[:label].blank?%>
        <%params << event[:value].to_i if !event[:value].blank?%>
        _gaq.push([<%=params.join(', ')%>]);
    <% end %>
    <% end %>
<% session[:events] = Array.new %>

С этим параметром я получаю почти мгновенное обновление отслеживаемых событий в GA ...

0 голосов
/ 16 ноября 2017

Вы можете использовать этот великий маленький драгоценный камень, который называется Rack Tracker . Он позволяет подключать к нему несколько популярных трекеров (GA, GTM, FB Pixel и т. Д.) И запускать связанные события через контроллеры, например:

def show
  tracker do |t|
    t.google_analytics :send, { type: 'event', category: 'button', action: 'click', label: 'nav-buttons', value: 'X' }
  end
end

, который становится:

ga('send', { 'hitType': 'event', 'eventCategory': 'button', 'eventAction': 'click', 'eventLabel': 'nav-buttons', 'value': 'X' })

ИЛИ вы можете использовать другой камень - Gabba , который работает аналогичным образом:

Gabba::Gabba.new("UT-1234", "mydomain.com").page_view("something", "track/me")
...