0

我正在尝试实现一种功能,该功能采用访问者的 IP 地址并在站点的标题中返回城市名称。

但是,需要从预先填写的城市列表中删除该城市。我将用美国主要城市的列表填充该列表。

我的问题分为三个部分:

  1. 填充主要城市静态列表的最佳方式是什么——是通过迁移吗?
  2. 如何使用 Geocoder 从该预填充列表中仅返回城市?一些城市将是较小的城市,我想根据它们与这些城市的接近程度将它们“卷入”到较大的城市中
  3. 如何将标题中的城市显示为下拉列表并根据用户的 IP 将默认城市设置为用户的城市,同时还让用户从该下拉列表中选择不同的城市?

目前,我正在使用专用的 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 的新手,所以我不确定我在代码和结构方面是否正确。任何输入都会有所帮助。

4

1 回答 1

1

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

2) Geocoder doesn't came with that feature out of the box, what you can do, is to store the major cities on a table, with their latitude and longitude, then do a geo ip query to check what's the user latitude/longitude, and use geocoder to search the major city closer (Model.near) to the user lat/long.

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) %> 
于 2013-03-31T09:08:41.977 回答