0

データベースから緯度と経度の値を Google マップの coffeescript に挿入しようとしています。

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 ファイルの解析時にはまだインスタンス化されていません。(??)

ハードコードされた値を使用して coffeescript をテストしましたが、@location.latitude は私の見解では完全に機能します。何がうまくいかないのですか?

4

1 に答える 1

2

(Java | Coffee)Scriptアセットは、コントローラーが実行される前に処理され、ブラウザーに送信されます。つまり、コントローラーからではなく、JavaScriptに変換されたときに@locationselfが起こっても発生します。.js.coffee.erb本番環境にデプロイする場合、アセットは本番システムに何かがヒットする前にコンパイルされます(または少なくともコンパイルする必要があります)ので@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を使用しないでください。

于 2012-11-12T23:11:46.763 に答える