2012-02-14 13 views
7

Lo que quiero hacer es usar el seguimiento personalizado de eventos de google analytic desde mis controladores, donde la lógica está hecha. No estoy muy seguro de cómo poner el código de JavaScript en mi controlador o si es posible en absoluto. ¿Cómo hago para poner algo como esto dentro de mi controlador:¿Cómo uso los eventos personalizados de Google Analytics dentro del controlador de mis rieles?

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

o

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

gracias! ¿Y cuál de estos debería estar usando? EDIT:

Así es como lo configuro en base a la sugerencia:

código de seguimiento parcial:

<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 (añadí en el parámetro "valor")

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

controlador de aplicación (añadido "valor PARAM)

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 

probarlo en mi controlador de Tareas:

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 

EDIT: aquí mi código de salida GA, parece que todo está correcto:

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

Respuesta

17

Así es como lo hago, es bastante similar a cómo RoR implementa flash. Esencialmente, en el lado del servidor usted almacena los eventos que eventualmente desea enviar a GA a través de Javascript. Cuando finalmente se procesa una página, se genera Javascript para enviar los eventos y restablecer su tienda.

Entonces ...

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

.. llamar a ese método desde sus métodos de controlador individuales tantas veces como desee.

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

.. y lo poco que se hace referencia parcial que existe:

# _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 %> 
+0

estoy tratando esto ahora ... ¿cómo puedo confirmar que funciona sin esperar GA para actualizar los datos? Además, ¿Importa que cada cuenta tenga su propio subdominio? Me gustaría realizar un seguimiento de todos los subdominios por separado (ya configuro filtros avanzados para esto). Por último, ¿cómo funciona esto en el entorno de desarrollo? ¡¡Gracias!! –

+0

agregó la solución a la publicación original. ¿Te importaría buscar si la tengo correcta? –

+0

Creo que el chequeo de cordura apropiado para "hacer esto" es mirar el HTML generado en su navegador y ver si ve el JS apropiado escrito en el HTML. Compare eso con los documentos para GA. También podría probar la unidad para el JS apropiado en el HTML, usando una prueba de solicitud rspec, supongo. Si esta solución escribe el JS apropiado en el HTML, a partir de ahí es más una cuestión de "cómo pruebo los eventos de GA", que creo que es una pregunta bastante diferente. – cailinanne

1

Todo esto es casi correcta, pero Google analytics no acepta cadena vacía, y el último parámetro debe ser un número entero .

Así que modificó el _ga_events.html.erb así:

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

Con esta configuración me sale de actualización casi instantánea de los eventos rastreados en GA ...

3

saltar sobre esta suuuuper tarde, pero aquí hay una opción realmente rápida para lo anterior. Simplemente coloque este código en el controlador que debe desencadenar el evento personalizado:

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

¡Mucho más corto que usar sesiones!

0

Puedes usar esta gran pequeña gema que se llama Rack Tracker. Se le permite adjuntar un montón de seguidores populares (GA, GTM, FB píxeles, etc.) a la misma, y ​​eventos de fuego asociado a través de los controladores de este modo:

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

que se convierte en:

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

O usted podría utilizar otra de las joyas - Gabba, que funciona de manera similar:

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