【问题标题】:Should GeoCoder be used in model or controller?GeoCoder 应该用在模型还是控制器中?
【发布时间】:2017-11-02 00:19:03
【问题描述】:

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

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

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

【问题讨论】:

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

标签: ruby-on-rails rails-geocoder


【解决方案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】:

    我无法决定应该在哪里调用以使用 GeoCoder 填充数据库的纬度和经度值。

    绝对在模型中,这是您在后端所做的事情,userviewcontroller 与它无关..另外,如果我没记错的话,它会产生api 调用另一个(可能是谷歌)服务器,这样的逻辑不驻留在控制器中。

    记住:瘦控制器和胖模型

    怎么做?

    您可能可以使用 before_create 回调,例如

    before_create :assign_lat_long
    
    private
    
    def assign_lat_long
      # the logic
    end
    

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

    【讨论】:

    • 谢谢。你的回答对我的理解很有帮助。我只能将一个答案标记为答案,但您的答案同样有帮助并添加到另一个答案中。希望我可以将两者都标记为答案。谢谢。
    【解决方案3】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2011-07-19
      • 2023-03-11
      相关资源
      最近更新 更多