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

Should GeoCoder be used in model or controller?

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

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

我想我的主要困惑是由于控制器中的新方法和创建方法,那里没有太多内容,所以无法弄清楚如何在插入数据的 "save" 上游完成此操作为资源进入数据库。

I'm having trouble deciding where I should put this call to use GeoCoder to populate the latitude and longitude values for the database.

肯定是在模型中,这是你在后端做的事情,userviewcontroller 与它无关..另外,如果我没看错,它对另一个(可能是 google)服务器进行了 api 调用,并且此类逻辑不驻留在控制器中。

记住:瘦控制器和胖模型

怎么办?

您或许可以使用 before_create 回调,例如

before_create :assign_lat_long

private

def assign_lat_long
  # the logic
end

如果您不需要 quick/on 经纬度的 go 查找,我建议您像 delayed_job 或您已经使用的其他类似服务那样异步执行此操作。基本上,它不会影响服务器的用户体验或响应时间,因为它现在独立于第 3 方 API 的响应..

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

但是为了 "just getting it done",模型工作正常。

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

在你的(例子)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

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

  • 您需要添加 geocoder gem,然后告诉 gem 哪个 model 将保存 地址 。 ...在你的情况下,它可以是 address.rb 地址列 假设其他列 - latitude,longitude,city, country...等等
  • 以上将通过在您的 address.rb 中使用 geocoded_by 来实现,这将有助于 geocoder 填充其他列。
  • 您不必担心它应该放在哪里,因为从逻辑上讲,它总是在模型中并且在保存时初始化
  • 所以你所要做的就是..在你 controllercreate 行动中......当你做 @address.save..这将触发 geocoder从您提交的表单的 params[:address] 字段中获取所有值。

保存地址对象后,其他值也将被填充,然后您可以按需要使用它们。

希望这对您有所帮助。