我在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函数在生产中工作正常。
答案 0 :(得分:2)
从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
有两个好处:
如果您拥有自己的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。