从 HTTP 请求获取区域设置
有时,根据请求 IP 设置应用程序区域设置会很有用。你可以使用 Geocoder
轻松实现此目的。在 Geocoder
所做的许多事情中,它也可以告诉 location
。
首先,将 Geocoder
添加到你的 Gemfile
# Gemfile
gem 'geocoder'
Geocoder
将 location
和 safe_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
请注意,这在 development
和 test
环境中不起作用,因为 0.0.0.0
和 localhost
之类的内容是有效的有效 Internet IP 地址。
限制和替代方案
Geocoder
功能强大且灵活,但需要配置为使用地理编码服务 ( 详情请参阅参考资料 ); 其中许多限制使用。同样值得注意的是,在每个请求上调用外部服务都会影响性能。
为了解决这些问题,还值得考虑:
1.离线解决方案
使用类似 GeoIP
的 gem (参见此处 )允许对本地数据文件进行查找。在准确性方面可能需要权衡,因为这些数据文件需要保持最新。
2.使用 CloudFlare
通过 CloudFlare 提供的页面可以选择透明地进行地理编码,并将国家/地区代码添加到标题中(HTTP_CF_IPCOUNTRY
)。更多细节可以在这里找到。