2016-10-19 116 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