从 HTTP 请求获取区域设置

有时,根据请求 IP 设置应用程序区域设置会很有用。你可以使用 Geocoder 轻松实现此目的。在 Geocoder 所做的许多事情中,它也可以告诉 location

首先,将 Geocoder 添加到你的 Gemfile

# Gemfile
gem 'geocoder'

Geocoderlocationsafe_location 方法添加到标准的 Rack::Request 对象中,这样你就可以通过 IP 地址轻松查找任何 HTTP 请求的位置。你可以在 before_action 中的 before_action 中使用此方法:

class ApplicationController < ActionController::Base
  before_action :set_locale_from_request

  def set_locale_from_request
    country_code = request.location.data["country_code"] #=> "US"
    country_sym = country_code.underscore.to_sym #=> :us

    # If request locale is available use it, otherwise use I18n default locale
    if I18n.available_locales.include? country_sym
      I18n.locale = country_sym
    end
end

请注意,这在 developmenttest 环境中不起作用,因为 0.0.0.0localhost 之类的内容是有效的有效 Internet IP 地址。

限制和替代方案

Geocoder 功能强大且灵活,但需要配置为使用地理编码服务详情请参阅参考资料 ); 其中许多限制使用。同样值得注意的是,在每个请求上调用外部服务都会影响性能。

为了解决这些问题,还值得考虑:

1.离线解决方案

使用类似 GeoIP 的 gem (参见此处 )允许对本地数据文件进行查找。在准确性方面可能需要权衡,因为这些数据文件需要保持最新。

2.使用 CloudFlare

通过 CloudFlare 提供的页面可以选择透明地进行地理编码,并将国家/地区代码添加到标题中(HTTP_CF_IPCOUNTRY)。更多细节可以在这里找到。