应该在模型或控制器中使用GeoCoder吗?

问题描述:

我有一个用户用于输入物理地址的表单,我想使用GeoCoder gem将该物理地址转换为纬度/长整型值集,当它们提交的模型提交时,我也可以将其存储在数据库中创建得到保存。应该在模型或控制器中使用GeoCoder吗?

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

我想我的主要困惑是由于在新的和创建方法的控制器中,没有太多,所以不知道如何得到这个插入数据为资源的“保存”的上游完成此操作进入数据库。

+0

为什么不在推测之前阅读自述文件?地理编码器旨在在模型中进行地理编码和反向地理编码。 – max

胖模型,皮包骨架控制器和一大堆服务对象。

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

这个想法是,你应该能够在任何地方调用相同的方法(在这种情况下,你的地理编码方法),而无需复制面食代码。你知道,那整个不重复自己的事情。

在你(例如)

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

感谢您的回答。这非常有帮助。 – user3064141

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

模型

当然,这是后话,您将在后端做和userviewcontroller无关与it..also,如果我没有错,它使一个API调用另一个(可能是谷歌)服务器和这样的逻辑不驻留在控制器中。

记住:薄控制器和脂肪模型

如何?

你或许可以使用before_create回调像

before_create :assign_lat_long 

private 

def assign_lat_long 
    # the logic 
end 

如果你并不需要一个快速/在旅途中查找的经纬度,我会建议你做异步像delayed_job或您已经使用的一些其他类似服务。基本上,它不会影响您的服务器的用户体验或响应时间,因为它现在独立于第三方API的响应。

+0

谢谢。你的回答对我的理解非常有帮助。我只能标记一个答案作为答案,但您的答案同样有帮助,并添加到另一个答案中。希望我可以将两者都标记为答案。谢谢。 – user3064141

我有点困惑你要买什么for.I一直在使用Geocoder相当长的时间,这是它做什么?包括你在找什么 -

  • 你需要添加geocoder宝石,然后告诉它model将持有地址宝石....在你的情况下,可以用address.rb地址假设其他栏也是 - latitude,longitude,city,country ...等。
  • 以上将通过在address.rb该列,这将有助于geocoder填充其他列使用geocoded_by来实现。
  • 你不必担心在那里它应该是模型中逻辑性,因为它总是和保存初始化上。
  • 因此,所有你需要做的is..in你create行动controller ...当你做@address.save ..this将触发geocoderparams[:address]场从您所提交的表单来获取所有值。

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

希望这会有所帮助。

+0

谢谢。你的回答非常有帮助。 – user3064141