使用Google跟踪代码管理器和TurboLinks的动态数据

时间:2017-01-03 16:00:56

标签: ruby-on-rails google-tag-manager turbolinks

如何使用TurboLinks设置GTM?

问题:

GTM和SEO团队要求我将此添加到我的头部:

<% if user_signed_in? %>
  dataLayer = [{'userID': '<%= current_user.id %>'},{'userCategory': 'User'}];
<% end %>
</script>
<!-- Paste this code as high in the <head> of the page as possible: -->
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-N7MDCP');</script>
<!-- End Google Tag Manager -->

这将由TurboLinks缓存。我可以尝试将其包装在页面中:更改,但不会更新user_signed_in等的值。

我可以安全地将它移动到身体中,TurboLinks会刷新它吗?如果没有,我怎样才能让GTM与动态数据层和GTM一起工作?

2 个答案:

答案 0 :(得分:2)

根据Turbolinks文档,您必须添加

document.addEventListener("turbolinks:load", function() {

到您不想缓存的脚本的开头(Turbolinks documentation reference)

请在此处查看full example

对dataLayer推送脚本执行相同的操作,并在两个脚本中包含console.log(),以确保它们在应用时触发,并且仅在它们应该的时候触发。

答案 1 :(得分:1)

  

我可以安全地将其移动到TurboLinks将刷新的身体中   它?

稍作修改,是的。

初始化GTM代码上方的(空)dataLayer变量。

Debug.Print SpecificRow.Item(1, 1).Address
'...or...
Debug.Print SpecificRow.Cells(1, 1).Address

然后可以通过var dataLayer = []; <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-N7MDCP');</script> <!-- End Google Tag Manager -- 方法添加dataLayer中的任何更改(这不是标准的javascript数组推送,Google已经用自己的实现覆盖了dataLayer的那个)。如果添加没有本机事件的新值(加载,DOM就绪,窗口加载),您还需要添加自定义GTM事件(push是GTM中的一种保留字;如果添加一个对象,则key&#34; GTM&#34;到dataLayer数组GTM使用新变量更新其内部数据模型,您可以使用该事件来触发标记。)

所以你的实现可能看起来像这样(这在身体里。虽然我知道GTM我实际上并不知道Turbolinks,但你明白了):

event

现在,您可以在类型&#34;自定义事件&#34;的GTM中创建触发器。事件名称为&#34; loginStateChanged&#34;,并且在该触发器之后/之后触发的所有标记都可以访问userID和userCategory变量。