首页 > 解决方案 > 根据 IP 预填充用户的时区?

问题描述

我有一个简单的时区字段,格式如下:

<div class="field">
  <%= f.label :time_zone %><em> (appointment times will be displayed in your timezone)</em><br>
  <%= f.select :time_zone, time_zone_options_for_select(f.object.time_zone, nil, ActiveSupport::TimeZone), {include_blank: true}, class: "form-control" %>
</div>

我在其他地方阅读过最佳实践是使用用户 IP 地址的时区预填充该字段,并且用户 99% 的时间都会接受该字段(如果不是用户的时区,他们可以简单地改变它)

如何在 ruby​​ on rails 应用程序中实现这一点?

标签: ruby-on-railsruby-on-rails-6

解决方案


要根据用户 IP 查找位置,您需要使用外部 API,例如IPStack - 没有“rails 方式”,因为它不是 Rails 的功能。

Geocoder gem通常用于此目的,它有一个不错的可用于地理编码的服务提供商列表。设置地理编码器后,您可以通过 IP 进行查找:

results = Geocoder.search("172.56.21.89")
results.first.time_zone

请注意,结果中实际返回的字段取决于使用的后端服务。也可以只使用您想直接与 Net::HTTP 或您选择的任何 HTTP 客户端一起使用的任何服务的 API。


推荐阅读