在Rails中实时谷歌地图

时间:2016-08-09 22:50:58

标签: ruby-on-rails google-maps

我有一个显示在页面上的谷歌地图,每个位置的标记都根据每个位置状态使用不同的标记。

我希望在更新位置时:为要查看的所有人重新呈现地图。这意味着所有标记都会更新,因此没有用户会查看旧的标记指示器。

我怎样才能做到这一点?我尝试使用$order = $this->Orders->get($id, ['contain' => [ 'Reviews' => function ($q) { return $q->find('latest'); } ]]); ,但显然render_Sync gem必须单独加载整个集合。这意味着它尝试将地图渲染为与地图一样多的次数,这会向Google地图发送太多请求并导致其失败/破坏。

2 个答案:

答案 0 :(得分:1)

您的Google地图已通过Javascript调用在您的视图中初始化。您只需要编写一些方法,在某些时间间隔内重复调用控制器或其他REST服务器。每次成功回复后,您都会更新您的标记位置。

类似的东西:

import passport from 'passport'
import passportStripe from 'passport-stripe'

const StripeStrategy = passportStripe.Strategy
const STRIPE_CLIENT_ID = '...'
const STRIPE_API_KEY = '...'

module.exports = passport.use(new StripeStrategy({
  clientID: STRIPE_CLIENT_ID,
  clientSecret: STRIPE_API_KEY,
  callbackURL: "http://localhost:3000/pay"
}, (accessToken, refreshToken, stripe_properties, done) => {
    (() => {}, (err, user) => { // wasn't sure about this line, the passport-stripe docs are unclear
      done(err, user)
    })
}))

答案 1 :(得分:0)

您可以使用“动作电缆”将坐标广播到UI,将其保存在某些数据属性中,然后从地图脚本中对其进行轮询。

您可以按照以下步骤操作:

  • 创建一个新频道。让我们称之为“位置”:

    rails g channel locations

  • 在收到最新坐标时广播它们:

    ActionCable.server.broadcast 'locations_channel', { latitude: 'NEW_LATITUDE', longitude: 'NEW_LONGITUDE' }

  • 一旦在用户界面上收到最新的坐标,就可以将其设置为地图div的数据属性,如下所示: $('#map').data(data); 您可以在this gist

  • 中找到此部分的代码段
  • 定期轮询地图div的数据属性,并使用以下方法更新标记的位置: marker.setPosition(latlng)

我写了a step by step guide on Medium on how to do this。您可以看看更多。