Search code examples
ruby-on-railsruby-on-rails-3openlayersgmaps4rails

Gmaps4Rails with OpenLayers gives JS error when marker clicked: this.serviceObject is undefined


I am having trouble with using OpenLayers in Gmaps4Rails (Gem version 1.5.2.) When I click on a marker I would like to show the typical callout (Infobox). Unfortunately I get the following JavaScript error:

this.serviceObject is undefined

Firebug calls the line 195 of the file "gmaps4rails.openlayers.js" responsable:

return this.serviceObject.addPopup(popup);

If I use Google Maps as API provider instead, everything works fine. Showing and hiding the infobox works nicely. This is why I assume that the error must be somewhere in "gmaps4rails.openlayers.js"

I tried on the latest FF and Chrome on Mac.

For reproducing the error in a reduced example, I created a simple HTML page in the public folder of my Rails 3.2 app and directly linked the needed JS and CSS files. To create the HTML page I copied the HTML code of my broken Rails app and reduced it.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <link href="/assets/gmaps4rails.css" media="screen" rel="stylesheet" type="text/css" />
    <script src="/assets/gmaps4rails/gmaps4rails.base.js" type="text/javascript"></script>
    <script src="/assets/gmaps4rails/gmaps4rails.openlayers.js" type="text/javascript"></script>
  </head>
  <body>
    <div class="map_container"> 
      <div id="map" class="gmaps4rails_map"></div>
    </div>
    <script src="http://www.openlayers.org/api/OpenLayers.js" type="text/javascript"></script>
    <script type="text/javascript" charset="utf-8">
      Gmaps.map = new Gmaps4RailsOpenlayers();
      Gmaps.load_map = function() {
        Gmaps.map.map_options.provider = "openlayers";
        Gmaps.map.initialize();
        Gmaps.map.markers = [
          {"description":"<p>This shall be in in the popup</p>",
          "id":117979030,
          "lat":39.5715,
          "lng":2.64694}
        ];
        Gmaps.map.create_markers();
        Gmaps.map.adjustMapToBounds();
        Gmaps.map.callback();
      };
      Gmaps.oldOnload = window.onload;
      window.onload = function() { 
        Gmaps.triggerOldOnload();
        Gmaps.loadMaps();
      };
    </script>
  </body>
</html>

Unfortunately I could not find a working example of a successful Gmap4Rails–Openlayers integration on the web. Am I missing a mandatory parameter?

Thanks in advance.


Solution

  • It's a bug.

    Replace:

    return this.serviceObject.addPopup(popup);
    

    with:

    return this.map.addPopup(popup);
    

    I'll push a fix soon, thanks and +1