将Google Analytics添加到Rails 4.2应用程序

5
我有一个运行在Heroku上的Rails 4.2应用程序,我尝试为其添加Google Analytics。然而,Google Analytics并没有接收到任何会话信息。
有什么建议可以解决这个问题吗? 代码: /app/layouts/_footer.html.erb:
<% if Rails.env.production? %>
  <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-XXXXXXXX-X', 'herokuapp.com');
    ga('send', 'pageview');

  </script>
<% end %>

/app/layouts/application.html.erb:

<!DOCTYPE html>
<html>
<head>
  <title>Title</title>
<%= Gon::Base.render_data({}) %>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>

<div class="container">
    <%= yield %>
</div>

<%= render 'layouts/footer' %>

</body>
</html>

/app/assets/javascripts/analytics.js.coffee:

$(document).on 'page:change', ->
 if window._gaq?
  _gaq.push ['_trackPageview']
 else if window.pageTracker?
  pageTracker._trackPageview()

/app/assets/javascripts/application.js:

//= require jquery
//= require analytics
//= require bootstrap
//= require jquery_ujs
//= require jquery.ui.all
//= require Chart
//= require jquery.turbolinks
//= require lodash
//= require_tree .

Gemfile:

source 'https://rubygems.org'

gem 'rails',                '4.2.2'
gem 'bootstrap-sass',       '3.2.0.0'
gem 'sass-rails',           '5.0.2'
gem 'uglifier',             '2.5.3'
gem 'coffee-rails',         '4.1.0'
gem 'jquery-rails',         '4.0.3'
gem 'jquery-ui-rails', '~> 4.2.1'
gem 'turbolinks',           '2.3.0'
gem 'jquery-turbolinks'
gem 'jbuilder',             '2.2.3'
gem 'sdoc',                 '0.4.0', group: :doc
gem 'chart-js-rails'
gem 'gon'
gem 'lodash-rails'

group :development, :test do
  gem 'sqlite3',     '1.3.9'
  gem 'byebug',      '3.4.0'
  gem 'web-console', '2.0.0.beta3'
  gem 'spring',      '1.1.3'
end

group :production do
  gem 'pg',             '0.17.1'
  gem 'rails_12factor', '0.0.2'
end

只是让你知道,在这个问题中,你正在混合使用两个不同版本的Google Analytics网页跟踪库。在你的_footer.html.erb文件中,你正在使用analytics.js跟踪代码片段,但在你的analytics.js.coffee文件中,你正在使用旧版的ga.js代码,这将不起作用,因为你从未加载过ga.js库,而是加载了analytics.js。 - Philip Walton
1个回答

7

你添加脚本的方式是错误的,因为它不会因为 Turbolinks 而工作。你知道你在 _footer 中的代码不会按预期运行,因为那一部分标记不会因为 Turbolinks 而重新加载。

我将为我所有的 Rails 应用程序提供自定义的 Google Analytics 实现。

在你的 app/assets/javascripts 目录下创建一个名为 google_analytics.js.coffee 的新文件,并添加以下脚本:

class @GoogleAnalytics

  @load: ->
    # Google Analytics depends on a global _gaq array. window is the global scope.
    window._gaq = []
    window._gaq.push ["_setAccount", GoogleAnalytics.analyticsId()]

    # Create a script element and insert it in the DOM
    ga = document.createElement("script")
    ga.type = "text/javascript"
    ga.async = true
    ga.src = ((if "https:" is document.location.protocol then "https://ssl" else "http://www")) + ".google-analytics.com/ga.js"
    firstScript = document.getElementsByTagName("script")[0]
    firstScript.parentNode.insertBefore ga, firstScript

    # If Turbolinks is supported, set up a callback to track pageviews on page:change.
    # If it isn't supported, just track the pageview now.
    if typeof Turbolinks isnt 'undefined' and Turbolinks.supported
      document.addEventListener "page:change", (->
        GoogleAnalytics.trackPageview()
      ), true
    else
      GoogleAnalytics.trackPageview()

  @trackPageview: (url) ->
    unless GoogleAnalytics.isLocalRequest()
      if url
        window._gaq.push ["_trackPageview", url]
      else
        window._gaq.push ["_trackPageview"]
      window._gaq.push ["_trackPageLoadTime"]

  @isLocalRequest: ->
    GoogleAnalytics.documentDomainIncludes "local"

  @documentDomainIncludes: (str) ->
    document.domain.indexOf(str) isnt -1

  @analyticsId: ->
    # your google analytics ID(s) here...
    'UA-xxxxxxxx-x'

GoogleAnalytics.load()

正如您所看到的,它为Turbolinks添加了支持。这是一种更加干净和更好的方法,可以将Google Analytics添加到您的应用程序中。希望它对您有用。


谢谢。在/app/assets/javascripts/application.js文件中,我应该用//= require analytics替换//= require analytics吗? - Bhav
1
你不需要修改你的application.js文件,因为你已经有了//= require_tree .,所以你根本不需要//= require analytics - svelandiag
@SsouLlesS 看起来很不错!有没有办法将其限制在生产环境中? - simonlehmann
@slehmann36 嗯,你可以访问当前的 ENV 并在脚本中添加条件语句,参考这个链接 https://dev59.com/BV_Va4cB1Zd3GeqPX-Rf - svelandiag
1
这个 .js.coffee 文件是你唯一需要的东西吗,还是需要在其他地方引用它? - Juanse Cora
@JuanseCora,你只需要将咖啡文件添加到你的资产中,就这样,别忘了点赞!! - svelandiag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接