1

我有一个简单的 gmaps V3 api 调用来生成基于位置记录中的纬度/经度的静态地图。该文件位于asset/javascripts 目录中,并命名为 location_static_map.erb.js

这是代码:

var location;
function initialize() {
  var myOptions = {
    zoom: 10,
    mapTypeId: google.maps.MapTypeId.HYBRID
  };
  var map = new google.maps.Map(document.getElementById("location_static_map"), myOptions);
  var lat = <%= "#{@location.latitude}" %>;
  var lon = <%= "#{@location.longitude}" %>;
  location = lat,lon;
  map.setCenter(location);
  var marker = new google.maps.Marker({
    position: location,
    map: map,
    visible: true,
    draggable: false,
    title: "Your Location is Here..."
  });
}

我在嵌入式 erb 代码上收到语法解析错误。请注意,我有其他针对 V3 api 构建的动态映射运行良好,因此这是嵌入式 erb 评估的定义问题....还请注意,我已尝试将文件扩展名作为 .js.erb 假设我处理顺序错误,但这导致“纬度”出现未定义的方法错误,因为它到达了 erb 代码的第一行......

另请注意,生成的 application.js 文件中发生解析错误

任何意见表示赞赏.....

4

1 回答 1

4

据我了解,当您将此代码发布到生产环境时,您会将所有 js 资产“编译”到单个 application.js 文件中 - 届时将评估 erb 并且永远不会再次评估。在开发中,这不是问题,因为 application.js 在每个请求上都会编译。通过查看您的代码,我假设您希望 @location 值随着每个请求而更改,您当前的方法将不起作用。

至于您收到的错误,是 sprokets 解析错误还是客户端 javascript 错误?正在处理 js.erb 时猜测 @location 为零?

您可能希望将此代码包装到可重用的 javascriopt 函数/对象中,然后在调用客户端代码时在视图中设置实例变量?那个电话可能看起来像这样

<script>
window.App.Locator.initialize('<%= @location.latitude %>', '<%= @location.longitude %>');
</script>

使用视图本身中的此代码,将在每个请求上重新评估 erb,即使在生产中也是如此

于 2011-08-01T15:37:58.963 回答