【问题标题】:js.coffee.erb - sync issue?js.coffee.erb - 同步问题?
【发布时间】:2012-11-01 10:02:37
【问题描述】:

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

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 在我看来非常有效。 有什么想法吗?

【问题讨论】:

    标签: javascript ruby-on-rails-3 google-maps-api-3 coffeescript erb


    【解决方案1】:

    您的 (Java|Coffee)Script 资产将在您的控制器运行之前被处理并发送到浏览器。这意味着@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 用于在您的应用程序运行时会发生变化的任何内容。

    【讨论】:

    • 是的,我曾想过这样的事情。感谢您的信息,我想长期 AJAX 是更优雅的解决方案。
    • 我会将data-coordinates="{ lat:&lt;%= @location.latitude %&gt;, lng:&lt;%= @location.longitude %&gt;]" 放在#map_canvas 上,然后用$('#map_canvas').data('coordinates') 取回
    • @Guillaume86:那也不错,或者根据情况分开data-latdata-lng属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2011-07-15
    • 2015-05-03
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多