Rails与谷歌地图。 TypeError:a为null

时间:2016-04-23 12:50:54

标签: ruby-on-rails ruby google-maps ruby-on-rails-4

我在rails应用程序上有一个ruby,其中80%的页面使用谷歌地图。所以在我的许多单独的JS文件中(在assets / javascripts中)我已经包含了许多谷歌的变量,如

google.maps.DirectionsStatus
new google.maps.LatLng(a,b)
new google.maps.Marker
google.maps.event.addListener

我已在头部

的application.html.erb中包含以下脚本
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=<%= ENV["GOOGLE_MAP"]%>&sensor=false&libraries=places">
</script>

在我不使用谷歌地图的页面中制作时,控制台上会显示错误

TypeError: a is null
  

...(空,_ IA)},P $ =函数(A,B){this.j =一个; this.ma = a.value中; this.Vd(this.ma);此。 V = b ...

这会阻止运行中没有google地图的页面中的其他javascript函数。本地主机中的所有内容都可以正常工作(仅限于生产(Aws-ec2服务器与ubuntu。服务器nginx和app服务器puma)它无法正常工作。我在google地图集成方面出错吗?这个问题有解决方法吗?

注意:我没有在应用程序中使用turbolink。

更新:进一步测试时,只有document.ready函数不能在这些页面上运行。这些页面上的其他js函数在生产中工作正常。

1 个答案:

答案 0 :(得分:2)

隔离Google Map API

从application.html.erb中删除Google脚本包含。如果您在每个页面上都不需要它,请不要在每个页面上加载它。

创建部分_map_handler.html.erb(或其他)。在顶部,包含您的Google地图js:

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=<%= ENV["GOOGLE_MAP"]%>&sensor=false&libraries=places">
</script>

这部分(或任意数量的部分)是放置所有地图(视图)动作的地方。它可能不需要说,但所有谷歌电话必须只是部分。

google.maps.DirectionsStatus
new google.maps.LatLng(a,b)
new google.maps.Marker
google.maps.event.addListener

有两个好处:

  • 未在不需要的网页上加载Google脚本
  • 如果你切换到另一个地图api,你需要更改部分,但你将避免在你的视图中散布谷歌地图代码依赖性。

如果您拥有自己的JavaScript地图处理程序,则必须将地图js隔离到自己的编译资产中。

三个步骤

<强>的application.js

Remove //= require_tree .

含义:您现在必须手动将主要资产glob中需要的每个js文件包含为包含行。这可能会破坏你的资产,但是为了隔离地图js,你必须经历这个。

重要:确保您未在​​application.js中包含my_map_handlers.js

<强> assets.rb

添加一行以将my_map_handlers.js编译成单独的资产文件

Rails.application.config.assets.precompile += %w( my_map_handlers.js)

<强> _map_handler.html.erb

在Google地图API之后和任何参考之前包含您的my_map_handlers js(将通过上述步骤单独编译)

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=<%= ENV["GOOGLE_MAP"]%>&sensor=false&libraries=places">
</script>

<%= javascript_include_tag 'my_map_handlers' %>

编译/引用单个资产的官方文档是here