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 評価の問題です。処理順序が間違っていましたが、erb コードの最初の行にヒットしたため、'latitude' の未定義のメソッド エラーが発生しました....

また、生成された application.js ファイルで解析エラーが発生していることにも注意してください。

任意の入力をいただければ幸いです.....

4

1 に答える 1

4

このコードを本番環境にリリースすると、すべての js アセットが単一の application.js ファイルに「コンパイル」されることを理解しています。erb はその時点で評価され、二度と評価されません。開発中は、application.js がすべてのリクエストでコンパイルされるため、これは問題ではありません。あなたのコードを見ると、リクエストごとに @location の値を変更する必要があると思いますが、現在のアプローチは機能しません。

あなたが受け取っているエラーに関しては、それはスプロケットの解析エラーですか、それともクライアント側の JavaScript エラーですか? js.erb が処理されているときに @location が nil だと思いますか?

このコードを再利用可能な javascriopt 関数/オブジェクトにラップしてから、クライアント側のコードを呼び出すときにインスタンス変数をビューに設定することをお勧めします。その呼び出しは次のようになります

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

ビュー自体にこのコードを使用すると、本番環境であっても、リクエストごとにerbが再評価されます

于 2011-08-01T15:37:58.963 に答える