0

我们将 Postgis 适配器与 Ruby on Rails 一起使用,并且我们正在尝试将 Puma on Heroku 用于我们的生产环境。我们的测试在开发系统上完美通过。此外,该服务器在除 Heroku 之外的所有生产服务器上都能完美运行,但是一旦我们在 Heroku + Puma(或 Unicron)上运行它,就会出现异常。

附带说明一下,当在 Heroku 上使用 Webrick 部署时,应用程序可以顺利运行。

当使用 puma(稍后尝试使用 unicorn)作为默认 Web 服务器时,一切都很顺利,但只有一件事:

我正在使用 RGeo gem 来跟踪一些蜂巢位置。当切换到 Puma (Unicorn) 时,在我的 Javascript 视图中调用@hive.current_location.lon@hive.current_location.lat抛出错误:

ActionView::Template::Error (undefined method 'lon' and 'lat' for #<RGeo::Cartesian::PointImpl:0x007f700846c970>)

同时,我尝试通过以下方式访问 current_location 经纬度heroku run rails console

有趣的是,在 Heroku 控制台上获取 lat 和 long 值会返回正确的值。看来问题是由美洲狮和独角兽引起的。

有什么建议吗?

4

1 回答 1

1

最后我找到了解决方案。阅读这篇文章。

更多细节:

基本上,在我的蜂巢模型中,我使用:

set_rgeo_factory_for_column(:current_location, 
                          RGeo::Geographic.spherical_factory(:srid => 4326))

然后在我的位置创建器中,我有以下代码:

require_relative "./coordinate_builder"
require 'rgeo'

class LocationCreator
  DEFAULT = "default"

  def self.create(lat_lng)
    return nil if lat_lng == DEFAULT

    lng, lat = CoordinateBuilder.parse(lat_lng)
    geographic_factory = RGeo::Geographic.spherical_factory
    geographic_factory.point(lng, lat)
  end
end

稍后在视图中,我使用以下代码获取点的纬度和经度,以创建 Google 地图标记并将其固定在地图上:

<% if @hive.current_location.present? %>
  var myLatlng = new google.maps.LatLng(<%= @hive.current_location.latitude %>, <%=@hive.current_location.longitude %>);
  var mapOptions = {
    zoom: 16,
    center: myLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
<% end  %>

问题:显然Rgeo::Geographic::SphericalPointImpl回退到RGeo::Cartesian::PointImpl我的 Javascript 代码中。

解决方法:我将 javascript 调用从 更改@hive.current_location.lat@hive.current_location.y. 同样对于纬度,我做了同样的事情:@hive.current_location.lonto @hive.current_location.x.

这解决了我的问题。

于 2015-02-19T17:29:23.863 回答