0

Ruby on Rails で Postgis アダプターを使用しており、本番環境に Heroku で Puma を使用しようとしています。私たちのテストは、開発システムで問題なくパスしました。また、サーバーは Heroku 以外のすべての本番サーバーで完全に動作しますが、Heroku + Puma (または Unicron) で実行すると、例外が発生します。

ちなみに、Heroku で Webrick を使用してデプロイすると、アプリケーションはスムーズに動作します。

デフォルトの Web サーバーとして puma (および後で試した場合は unicorn) を使用すると、すべてがうまくいきますが、次のことが 1 つあります。

ハイブの場所を追跡するために RGeo gem を使用しています。Puma (Unicorn) に切り替えると、Javascript ビューでand を呼び出す@hive.current_location.lonと、次のエラーがスローされます。@hive.current_location.lat

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

その間、私は現在の場所の緯度と経度にアクセスしようとしましたheroku run rails console

興味深いことに、Heroku コンソールで緯度と経度の値をフェッチすると、正しい値が返されます。問題は puma と unicorn に起因するようです。

なにか提案を?

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  %>

問題: どうやら私の Javascript コードにRgeo::Geographic::SphericalPointImplフォールバックします。RGeo::Cartesian::PointImpl

回避策: JavaScript 呼び出しを から に変更し@hive.current_location.latました@hive.current_location.y。緯度についても、同じ@hive.current_location.lonことをしました@hive.current_location.x

これで問題は解決しました。

于 2015-02-19T17:29:23.863 に答える