链轮没有正确地在js文件中访问erb

时间:2011-08-01 14:42:19

标签: javascript erb ruby-on-rails-3.1 sprockets

我有一个简单的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文件中发生了解析错误

任何投入赞赏.....

1 个答案:

答案 0 :(得分:4)

我的理解是,当您将此代码发布到生产环境时,您将把所有js资产“编译”到一个application.js文件中 - 那时将对erb进行评估,而不会再次进行评估。在开发中,这不是问题,因为application.js是在每个请求上编译的。从查看代码开始,我假设您希望@location值随每个请求而变化,您当前的方法无法正常工作。

就您收到的错误而言,是sprokets解析错误还是客户端javascript错误?在处理js.erb时猜测@location是否为nil?

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

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

在视图中使用此代码,即使在生产中,也会对每个请求重新评估erb