2012-02-14 53 views
7

我想要做的是使用谷歌分析的自定義事件跟蹤從我的控制器,其中的邏輯完成。我不太清楚如何將JavaScript代碼放在我的控制器中,或者如果可能的話。我怎麼會去把這樣的事情我的控制器內:如何在我的導航控制器中使用Google Analytics自定義事件?

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

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

的感謝!我應該使用哪一個? 編輯:

以下是我設置它基於的建議:

跟蹤代碼部分:

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

應用控制器(增加「值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 

測試它在我的任務控制器:

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> 

回答

17

這裏是我如何做到這一點,這是相當類似如何RoR實施flash。從本質上講,在服務器端存儲最終要通過Javascript推送到GA的事件。當頁面最終呈現時,您將呈現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 %> 
+0

我想要這個現在...我如何確認它的工作原理,而無需等待GA來更新數據?另外,每個帳戶都有自己的子域是否重要?我想分開跟蹤所有子域(我已經爲此設置了高級過濾器)。最後,這是如何在開發環境中工作的?謝謝!! – 2012-02-14 22:28:59

+0

將解決方案添加到原始文章 - 您是否介意查看我是否正確? – 2012-02-14 22:46:23

+0

我認爲適合的「完成這項工作」的完整性檢查是查看瀏覽器中生成的HTML,看看是否看到用HTML編寫的合適的JS。將其與GA的文檔進行比較。你也可以使用rspec請求測試來測試HTML中適當的JS。如果這個解決方案在HTML中寫入適當的JS,那麼從那裏開始,更多的是「我如何測試GA事件」,我認爲這是一個不同的問題。 – cailinanne 2012-02-15 03:00:32

1

所有這一切幾乎是正確的,但谷歌分析不接受空字符串,最後一個參數必須是整數

所以我修改了_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的跟蹤的事件幾乎瞬間刷新...

3

跳上這個suuuuper晚了,但這是上述的一個非常快速的選擇。只需將此代碼放置在應觸發自定義事件的控制器中:

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

比使用會話短得多!

0

您可以使用這個名爲Rack Tracker的小寶石。它可以讓你通過控制器附上一堆流行的縴夫(GA,GTM,FB像素等),它和火有關的事件,像這樣:

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") 
相關問題