地理编码2地址与地理编码宝石

时间:2016-10-19 13:29:15

标签: ruby-on-rails google-geocoder rails-postgresql

我正在尝试对以1种形式提出的2个地址进行地理编码。

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

他们都使用Google自动完成功能,如下所示:

<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个新的纬度和经度值:location但我想知道如何做到这一点。

基本上我想了解为什么它只对:kotadres属性进行地理编码,而不是:location属性。我尝试了以下事项:

  • 切换表单中的两个输入字段(结果:仅:kotadres得到地理编码)
  • 删除:kotadres输入字段(结果::位置无法进行地理编码)

我的学生模型如下所示:

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

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

因此,如果有人知道如何对这2个地址进行地理编码,或者如果有人知道为什么它总是对:kotadres属性进行地理编码,那么我非常乐意知道答案。

1 个答案:

答案 0 :(得分: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

请参阅: