2017-06-01 81 views
0

我有一個用戶用於輸入物理地址的表單,我想使用GeoCoder gem將該物理地址轉換爲緯度/長整型值集,當它們提交的模型提交時,我也可以將其存儲在數據庫中創建得到保存。應該在模型或控制器中使用GeoCoder嗎?

我無法決定在哪裏讓這個調用使用GeoCoder來填充數據庫的緯度和經度值。我認爲這將在模型類中進行,但不確定是否應該在初始化方法中執行此操作,在該方法中我接受物理地址,然後在初始化方法中使用調用geocoder爲@latitude和@longitude設置值,還是有更好的方法或地方來做到這一點,比如只需在模型中使用attr_accessor,然後在保存操作完成之前調用它來在控制器中設置這些值。

我想我的主要困惑是由於在新的和創建方法的控制器中,沒有太多,所以不知道如何得到這個插入數據爲資源的「保存」的上游完成此操作進入數據庫。

+0

爲什麼不在推測之前閱讀自述文件?地理編碼器旨在在模型中進行地理編碼和反向地理編碼。 – max

回答

1

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

但是爲了「完成它」,模型正常工作。

這個想法是,你應該能夠在任何地方調用相同的方法(在這種情況下,你的地理編碼方法),而無需複製麪食代碼。你知道,那整個不重複自己的事情。

在你(例如)

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

1

我無法決定在哪裏讓這個調用使用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

1

我有點困惑你要買什麼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

相關問題