应该在模型或控制器中使用GeoCoder吗?
我有一个用户用于输入物理地址的表单,我想使用GeoCoder gem将该物理地址转换为纬度/长整型值集,当它们提交的模型提交时,我也可以将其存储在数据库中创建得到保存。应该在模型或控制器中使用GeoCoder吗?
我无法决定在哪里让这个调用使用GeoCoder来填充数据库的纬度和经度值。我认为这将在模型类中进行,但不确定是否应该在初始化方法中执行此操作,在该方法中我接受物理地址,然后在初始化方法中使用调用geocoder为@latitude和@longitude设置值,还是有更好的方法或地方来做到这一点,比如只需在模型中使用attr_accessor,然后在保存操作完成之前调用它来在控制器中设置这些值。
我想我的主要困惑是由于在新的和创建方法的控制器中,没有太多,所以不知道如何得到这个插入数据为资源的“保存”的上游完成此操作进入数据库。
胖模型,皮包骨架控制器和一大堆服务对象。
但是为了“完成它”,模型正常工作。
这个想法是,你应该能够在任何地方调用相同的方法(在这种情况下,你的地理编码方法),而无需复制面食代码。你知道,那整个不重复自己的事情。
在你(例如)
before_save :if => { |_| self.address_changed? && self.address.present? } do
result = Geocoder.search(self.address)
self.lat, self.lng = result.lat, result.lng
end
感谢您的回答。这非常有帮助。 – user3064141
我无法决定在哪里让这个调用使用GeoCoder来填充数据库的纬度和经度值。
模型
当然,这是后话,您将在后端做和user
或view
或controller
无关与it..also,如果我没有错,它使一个API调用另一个(可能是谷歌)服务器和这样的逻辑不驻留在控制器中。
记住:薄控制器和脂肪模型
如何?
你或许可以使用before_create
回调像
before_create :assign_lat_long
private
def assign_lat_long
# the logic
end
如果你并不需要一个快速/在旅途中查找的经纬度,我会建议你做异步像delayed_job
或您已经使用的一些其他类似服务。基本上,它不会影响您的服务器的用户体验或响应时间,因为它现在独立于第三方API的响应。
谢谢。你的回答对我的理解非常有帮助。我只能标记一个答案作为答案,但您的答案同样有帮助,并添加到另一个答案中。希望我可以将两者都标记为答案。谢谢。 – user3064141
我有点困惑你要买什么for.I一直在使用Geocoder相当长的时间,这是它做什么?包括你在找什么 -
- 你需要添加
geocoder
宝石,然后告诉它model
将持有地址宝石....在你的情况下,可以用address.rb
地址列假设其他栏也是 -latitude
,longitude
,city
,country
...等。 - 以上将通过在address.rb该列,这将有助于
geocoder
填充其他列使用geocoded_by
来实现。 - 你不必担心在那里它应该是模型中逻辑性,因为它总是和保存初始化上。
- 因此,所有你需要做的is..in你
create
行动controller
...当你做@address.save
..this将触发geocoder
从params[:address]
场从您所提交的表单来获取所有值。
一旦地址对象被保存,其他值也将被填充,然后您可以按照自己的方式使用它们。
希望这会有所帮助。
谢谢。你的回答非常有帮助。 – user3064141
为什么不在推测之前阅读自述文件?地理编码器旨在在模型中进行地理编码和反向地理编码。 – max