GeoCoder应该用在模型还是控制器中?

时间:2017-06-01 02:29:01

标签: ruby-on-rails rails-geocoder

我有一个用户用来输入物理地址的表单,我想使用GeoCoder gem将该物理地址转换为lat / long值集,当它们形成模型时我也可以存储在数据库中提交创建得到保存。

我无法决定将此调用放在哪里使用GeoCoder来填充数据库的纬度和经度值。我认为它会进入模型类,但不确定我是否应该在初始化方法中接受物理地址然后在初始化方法中使用调用地理编码器来设置@latitude和@longitude的值,或者是否有更好的方法或地点来执行此操作,例如在模型中简单地使用attr_accessor,然后在保存操作完成之前调用它以在控制器中设置这些值。

我想我的主要困惑是由于在new和create方法中的控制器中,没有多少因此无法弄清楚如何在将“资源”的数据插入“保存”的上游完成此操作数据库。

3 个答案:

答案 0 :(得分:1)

  

我无法决定将此调用放在哪里使用GeoCoder来填充数据库的纬度和经度值。

绝对在模型中,这是你在后端做的事情,viewcontrollerbefore_create :assign_lat_long private def assign_lat_long # the logic end 与它无关......如果我是没错,它会向另一个(可能是google)服务器发出api调用,这样的逻辑不存在于控制器中。

请记住:瘦控制器和胖模型

如何吗

您可以使用{/ 3}}回调,例如

delayed_job

如果您不需要快速/随时随地查找lat-longs,我建议您像37或您已经使用的其他类似服务一样异步执行。基本上,它不会影响服务器的用户体验或响应时间,因为它现在独立于第三方API的响应..

答案 1 :(得分:1)

胖模型,瘦控制器和一大堆服务对象。

但是为了“完成它”,模型工作正常。

我们的想法是,您应该可以在任何地方调用相同的方法(在本例中为您的地理编码方法),而无需复制面食代码。你知道,整个不重复自己的事情。

在您的(示例)place.rb

before_save :if => { |_| self.address_changed? && self.address.present? } do 
  result = Geocoder.search(self.address)
  self.lat, self.lng = result.lat, result.lng
end

答案 2 :(得分:1)

我对你在寻找什么感到有点困惑。我已经使用Geocoder很长一段时间了,这就是它的作用......包括你在寻找什么 -

  • 你需要添加geocoder gem,然后告诉gem model将保留地址 ....在你的情况下它可以是{{1} } 地址列假设其他列也是如此 - address.rblatitudelongitudecity等等。
  • 上述内容将通过在您的address.rb中使用country来实现,该列有助于geocoded_by填充其他列。
  • 你不必担心它应放在哪里,因为从逻辑上讲,它始终在模型中,在保存时初始化
  • 所以你需要做的就是...... geocoder create行动{当你controller时......这将触发@address.save取得全部geocoder字段中的值来自您提交的表单。

保存地址对象后,其他值也会被填充,然后您可以按照自己的方式使用它们。

希望这有帮助。