Ruby on rails 动态数据与谷歌标签管理器和TurboLink

Ruby on rails 动态数据与谷歌标签管理器和TurboLink,ruby-on-rails,google-tag-manager,turbolinks,Ruby On Rails,Google Tag Manager,Turbolinks,如何使用TurboLink设置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

如何使用TurboLink设置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 -->

数据层=[{'userID':'''},{'userCategory':'User'}];
(函数(w,d,s,l,i){w[l]=w[l]||【】;w[l]。推送({'gtm.start':
new Date().getTime(),事件:'gtm.js'});var f=d.getElementsByTagName[0],
j=d.createElement,dl=l!=“数据层”?“&l=”+l:“”;j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(窗口、文档、“脚本”、“数据层”、“GTM-N7MDCP”);
这将由TurboLink缓存。我可以尝试将其包装在page:change中,但这不会更新用户登录等的值

我可以安全地将其移动到身体中,TurboLink将在那里刷新它吗?如果没有,我如何让GTM与动态数据层和GTM一起工作

我能安全地把它移到身体里吗,TurboLink会在那里刷新 是吗

稍微修改一下,是的

初始化GTM代码上方的(空)数据层变量

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 --
现在,您可以在GTM中创建一个类型为“custom event”的触发器,事件名称为“loginStateChanged”,并且在该触发器触发/触发之后触发的所有标记都可以访问userID和userCategory变量

我能安全地把它移到身体里吗,TurboLink会在那里刷新 是吗

稍微修改一下,是的

初始化GTM代码上方的(空)数据层变量

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

现在,您可以在GTM中创建一个类型为“custom event”的触发器,事件名称为“loginStateChanged”,并且在该触发器触发/触发后触发的所有标记都可以访问userID和userCategory变量。

根据Turbolinks文档,您必须添加

document.addEventListener(“turbolinks:load”,function(){

指向不希望缓存的脚本的开头(

请看这里


对dataLayer push脚本执行相同的操作,并在两个脚本中都包含一个console.log(),以确保它们在本应启动时启动,并且仅在本应启动时启动。

根据TurboLink文档,您必须添加

document.addEventListener(“turbolinks:load”,function(){

指向不希望缓存的脚本的开头(

请看这里


对dataLayer推送脚本执行相同的操作,并包括一个console.log()在这两个脚本中,确保它们在应该启动的时候才启动。

好的,谢谢。如果我尝试在GTM的标题部分启动,是否需要更改主体部分?除非页面刷新,否则使用预览测试网站不会显示事件。GTM是否依赖于页面加载?我问了一个次要问题ch可能会更清楚:好的,谢谢。如果我尝试GTM的标题部分,我需要更改主体部分吗?使用预览测试网站不会显示事件,除非页面刷新。GTM依赖页面加载吗?我问了第二个问题,可能会更清楚:这对我来说根本不起作用。GTM事件永不触发。您是否尝试过使用GTM preview/debug on进行测试?标记事件是否显示在页脚中?此外,我需要在ERB中运行dataLayer push脚本以获得正确的值。而不仅仅是js使用第一页视图值再次触发,以便登录后它们是正确的。是的,当我使用GTM debug模式运行它时,调试窗口仅在第一次加载页面或刷新后续页面时加载,这非常烦人。但是,如果我刷新页面(以使调试模式重新出现),任何事件或数据层推送都会显示在调试器中。我添加
console.log(“gtm已激发”)的原因;
是在控制台中查看GTM何时启动,而不管调试器正在做什么。对于erb代码——您是否尝试将
标记放在erb代码中?这对我来说根本不起作用。GTM事件从不触发。您尝试过在打开GTM预览/调试的情况下测试它吗?标记事件是否显示为in页脚?此外,我需要在ERB中运行dataLayer push脚本以获得正确的值。而不仅仅是js使用第一个页面视图值再次激发,以便在登录后它们是正确的。是的,当我使用GTM调试模式运行它时,调试窗口仅在页面的第一次加载或后续页面的刷新时加载,这非常烦人但是,如果我刷新页面(使调试模式重新出现),任何事件或数据层推送都会显示在调试器中;是在控制台中查看GTM何时启动,而不管调试器在做什么。对于erb代码,您是否尝试将
标记放在erb代码中?