如何使用地理编码器从城市列表中自动显示用户的城市

时间:2013-03-30 22:50:40

标签: ruby-on-rails ruby geocoding

我正在尝试实现一种获取访问者IP地址并在网站标题中返回城市名称的功能。

但是,需要从预先填充的城市列表中提取城市。我将列出美国主要城市的名单。

我的问题有三个部分:

  1. 填写主要城市静态列表的最佳方式是什么?是通过迁移吗?
  2. 如何使用Geocoder仅从该预填充列表中返回城市?一些城市将是较小的城市,我希望根据它们与这些城市的接近程度“卷入”大城市
  3. 如何将标题中的城市显示为下拉菜单,并根据用户的IP将默认值设置为用户的城市,还让用户从该下拉菜单中选择其他城市?
  4. 目前,我使用的是专用的Location.rb模型和locations_controller.rb控制器。

    在我的模特中:

    reverse_geocoded_by :lat, :lon do |obj,results|
      if geo = results.first
        obj.city    = geo.city
      end
    end
    after_validation :reverse_geocode
    

    在我的控制器中:

    def index
        @ip = request.remote_ip
        @locations = Location.all
        @city = result.city
    end
    

    在我的标题部分:

    <%= collection_select(@cities) %>
    

    我是Rails和GeoCoder gem的新手,所以我不确定我是否在代码和结构方面做得正确。任何输入都会有所帮助。

1 个答案:

答案 0 :(得分:1)

1)迁移不是您应该填充任何数据的地方,您可以在db / seeds.rb文件中添加数据填充(通常运行:rake db:create; rake db:migrate; rake分贝:种子)。如果您不喜欢db / seeds.rb,则可以添加自定义Rake任务。

2)Geocoder没有开箱即用的功能,您可以做的是将主要城市存放在桌子上,具有纬度和经度,然后进行地理IP查询以检查用户是什么纬度/经度,并使用地理编码器搜索更近的主要城市(Model.near)到用户纬度/经度。

3)

def index
  @ip = request.remote_ip
  @locations = Location.all
  @lat, @lng = write_code_to_get_user_lat_and_lng
  @city = Location.near([@lat, @lng], maximum_radius_in_miles).first
end

<%= select_tag('user_city', options_for_select(@locations.collect {|l| [l.name. l.id]}, @city.id) %>