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'屬性。 –