0

我正在尝试将数据库中的纬度和经度值插入到我的谷歌地图咖啡脚本中。

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 在我看来非常有效。任何想法出了什么问题?

4

1 回答 1

2

您的 (Java|Coffee)Script 资产将在控制器运行之前被处理并发送到浏览器。这意味着它@location不会来自您的控制器,它将来自您转换为 JavaScriptself时发生的任何事情。.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 调用加载位置。

Only use ERB in your assets for per-application constants and configuration values, don't try to use ERB in your assets for anything that will change while your application is running.

于 2012-11-12T23:11:46.763 回答