Javascript 如何在rails控制器中使用Google Analytics自定义事件?
我想做的是在我的控制器中使用GoogleAnalytic的自定义事件跟踪,逻辑在控制器中完成。我不太确定如何将javascript代码放入我的控制器中,或者是否可能。我将如何在控制器中放置类似的东西:Javascript 如何在rails控制器中使用Google Analytics自定义事件?,javascript,ruby-on-rails,google-analytics,Javascript,Ruby On Rails,Google Analytics,我想做的是在我的控制器中使用GoogleAnalytic的自定义事件跟踪,逻辑在控制器中完成。我不太确定如何将javascript代码放入我的控制器中,或者是否可能。我将如何在控制器中放置类似的东西: _trackEvent(category, action, opt_label, opt_value, opt_noninteraction) def create @task = @user.tasks.build(params[:task]) @task.author = c
_trackEvent(category, action, opt_label, opt_value, opt_noninteraction)
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
或
谢谢!我应该使用哪一种?
编辑:
以下是我如何根据建议进行设置的:
跟踪代码部分:
<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输出代码,看起来一切都是正确的:
<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>
var _gaq=_gaq | |[];
_gaq.push([''设置帐户',''UA_代码']);
_gaq.push(['''u setDomainName','SUBDOMAIN']);
_gaq.push([''u trackPageview']);
_gaq.push([“跟踪事件”、“优先级”、“已创建(天)”、“标签信息”和“);
(功能(){
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);
})();
我是这样做的,这与RoR实现flash的方式非常相似。本质上,在服务器端,您存储最终希望通过Javascript推送到GA的事件。最终呈现页面时,您可以呈现Javascript以推送事件,并重置存储
所以
#应用程序_controller.rb
受保护的
def日志事件(类别、操作、标签)
会话[:事件]| |=Array.new
会话[:events]类别,:action=>action,:label=>label}
结束
。。尽可能多地从您的单个控制器方法调用该方法
# 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>
#application.html.erb
... 其他东西。。。
var _gaq=_gaq | |[];
_gaq.push([''设置帐户','');
_gaq.push([''u trackPageview']);
。。这里提到的小部分是:
# _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 %>
#u ga_events.html.erb
_gaq.push([''跟踪事件','','');
所有这些几乎都是正确的,但是Google analytics不接受空字符串,最后一个参数必须是整数
因此我修改了\u ga\u 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 %>
很晚才跳上这个suuuuper,但这里有一个非常快速的选项。只需将此代码放置在应触发自定义事件的控制器中:
flash.now[:event] = "<script>_gaq.push(['_trackEvent', '#{category}', '#{action}'])</script>".html_safe
flash.now[:event]=“_gaq.push([''''u trackEvent',''.{category}','.{action}'))”。html\u安全
比使用会话短得多 你可以使用这个叫做。它允许您将一系列流行的跟踪器(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' })
或者,您可以使用另一个gem-,其工作方式类似:
Gabba::Gabba.new("UT-1234", "mydomain.com").page_view("something", "track/me")
我现在正在尝试…我如何在不等待GA更新数据的情况下确认它是否有效?此外,每个帐户都有自己的子域是否重要?我想单独跟踪所有子域(我已经为此设置了高级过滤器)。最后,这在dev环境中是如何工作的?谢谢在原来的帖子中添加了解决方案-你介意看看我的答案是否正确吗?我认为“这行得通”的适当合理性检查是查看浏览器中生成的HTML,看看是否看到用HTML编写的适当JS。与GA的文档相比,您还可以使用rspec请求测试在HTML中对适当的JS进行单元测试。如果这个解决方案将适当的JS写入HTML,那么更多的问题是“如何测试GA事件”,我认为这是一个完全不同的问题。我不知道如何在一个GA帐户中管理多个子域。对于我的开发环境,我通常会设置一个单独的GA帐户,并将事件推送到那里。(这就是为什么GA帐户是一个变量CONFIG['GA\u account\u id']
)它无助于解决等待GA更新数据的问题,但至少您的开发事件不会混淆到您的生产数据中。看起来我把一切都设置好了,而且_trackEvent方法在我的GA代码中包含了所有适当的变量…但是由于某种原因,GA中没有显示任何内容。我想可能有延迟,但已经10个小时了。
flash.now[:event] = "<script>_gaq.push(['_trackEvent', '#{category}', '#{action}'])</script>".html_safe
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.new("UT-1234", "mydomain.com").page_view("something", "track/me")