0

我想从数据库中插入纬度和经度值到我的谷歌地图咖啡文字。js.coffee.erb - 同步问题?

jQuery -> 
    initialize() 

initialize = -> 
    myOptions = 
    center: new google.maps.LatLng(<%= @location.latitude %>, <%= @location.longitude %>) 
    zoom: 12 
    mapTypeControlOptions: {mapTypeIds: ["OSM", "OCM", "MQ", google.maps.MapTypeId.HYBRID]} 
    map = new google.maps.Map $('#map_canvas')[0], myOptions 

[...]

我收到以下错误信息:

undefined method `latitude' for nil:NilClass 
    (in /Users/sg/rails-projects/geo_rails_test/app/assets/javascripts/gmap.js.coffee.erb) 

表明我的位置对象

@location = Location.find(params[:id]) 

尚未在当时实例解析js.coffee.erb文件。 (??)

我已经用硬编码值测试了咖啡脚本,@ location.latitude完美地工作在我看来。 任何想法发生了什么问题?

回答

2

您的(Java | Coffee)脚本资产将被处理并发送到您的控制器运行前的之前。这意味着@location不会来自您的控制器,它会来自self恰好在您的.js.coffee.erb转换为JavaScript时。在部署到生产环境中时,资产将会(或者至少应该)在任何事情发生之前就编译完成,因此@location不会有任何用处。

你应该在你的控制器的ERB建立自己的数据,而不是资产:

<!-- Somewhere in the appropriate app/views/... file... --> 
<script type="text/javascript"> 
    window.global_location = { lat: <%= @location.latitude %>, lng: <%= @location.longitude %> }; 
</script> 

,然后你的资产可以通过this_location全球获取数据:

center: new google.maps.LatLng(global_loc.lat, global_loc.lng) 

或者你可以尝试加载通过AJAX调用的位置。

仅使用ERB在您的资产为每个应用程序的常量和配置值,不要尝试使用ERB在你的资产,你的任何应用程序运行时,将改变。

+0

是的,我曾经想过这样的事情。感谢您的信息,我想长期的AJAX是更优雅的解决方案。 – donsteffenski

+1

我会把'数据坐标= “{纬度:<%= @ location.latitude%>,LNG:<%= @ location.longitude%>]”'上#map_canvas与'$拿回来('# map_canvas')。data('coordinates')' – Guillaume86

+0

@ Guillaume86:这也是一个不错的选择,或者根据具体情况分开'data-lat'和'data-lng'属性。 –