2016-10-19 30 views
1

我想要2地址,這是在1形式要求。地理編碼2地址與地理編碼器寶石

<%= f.input :kotadres %> 
    <%= f.input :location %> 

他們都與谷歌自動完成這樣的工作:

<script> 
    var input = document.getElementById('student_location'); 
    var autocomplete = new google.maps.places.Autocomplete(input,{componentRestrictions: {country:'be'}}); 
    google.maps.event.addListener(autocomplete, 'place_changed', function(){ 
    var place = autocomplete.getPlace(); 
    }) 
</script> 

<script> 
    var input = document.getElementById('student_kotadres'); 
    var autocomplete = new google.maps.places.Autocomplete(input,{componentRestrictions: {country:'be'}}); 
    google.maps.event.addListener(autocomplete, 'place_changed', function(){ 
    var place = autocomplete.getPlace(); 
    }) 
</script> 

這工作完全正常,因爲這兩個地址存儲在數據庫中。

現在我想要在我的數據庫中對這兩個地址進行地理編碼。它已經工作了50%,因爲由於某種原因,它總是將地理編碼:kotadres放到緯度和經度列中,但我不知道爲什麼它僅對該屬性進行地理編碼,而不是對location屬性進行地理編碼。

這是我的學生表:

create_table "students", force: :cascade do |t| 
    t.string "location" 
    t.float "latitude" 
    t.float "longitude" 
    t.string "kotadres" 
    end 

我知道我必須建立2條新的列來存儲2個新的緯度和經度值:位置,但我想知道如何做到這一點。

基本上我想明白爲什麼它只geocodes:kotadres屬性而不是:location屬性。我嘗試了以下幾件事:

  • 開關等兩個輸入字段的形式(結果:只有:kotadres被地理編碼)
  • 刪除:kotadres輸入字段(結果:位置不會被地理編碼)

我的學生模型是這樣的:

geocoded_by :location 
after_validation :geocode, if: :location_changed? 

geocoded_by :kotadres 
after_validation :geocode, if: :kotadres_changed? 

因此,如果有人知道如何進行地址解析這兩個地址,或者如果有人知道爲什麼它總是在地理編碼:kotadres屬性,我高興地知道答案。

+0

你應該認真考慮使用一個獨立的地址模型,並建立一個一對多的關係。你目前的問題也是因爲你將所有東西都變成了一個單一的模型。 – max

回答

0

這裏的技巧是不是在一個模型做的一切:

class Student 
    has_many :addresses 
    accepts_nested_attributes_for :addresses 
end 

# latitude:float 
# longitude:float 
class Address 
    enum type: [:home, :work, :billing] #etc 
    belongs_to :student 
    geocoded_by :full_street_address 
    after_validation :geocode, if: :full_street_address_changed? 
end 

要設置的形式,一次你會做讓學生設置多個地址:

<%= form_for(@student) do |f| %> 
    <%= f.fields_for :addresses do |a| %> 
    <%= a.text_field :full_street_address %> 
    <% end %> 
<% end %> 

也需要設置控制器:

class StudentsController 

    def new 
    @student = Student.new do |s| 
     s.addresses.new 
     s.addresses.new 
    end 
    end 

    def create 
    @student = Student.new(student_params) 
    end 

    private 

    def student_params 
     params.require(:student).permit(
     :foo, 
     :bar, 
     addresses_attributes: [ 
      :full_street_address 
     ] 
    ) 
    end 
end 

請參見:

+0

這不是一個解決問題的方法,而是在正確的方向上微調,並要求您根據自己的情況調整解決方案。 – max

+0

如果您想跟蹤用戶地址和當前位置,您需要分別對學生和地址的位置進行地理編碼。 – max