有时,根据请求IP设置应用程序区域设置会很有用。您可以使用轻松实现此目标Geocoder。在做的许多事情Geocoder中,它也可以分辨出location的request。
首先,添加Geocoder到您的Gemfile
# 宝石文件 gem 'geocoder'
Geocoder向标准对象 添加location和safe_location方法,Rack::Request因此您可以通过IP地址轻松查找任何HTTP请求的位置。您可以在中的before_action中使用此方法ApplicationController:
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 # 如果请求语言环境可用,则使用它,否则使用I18n默认语言环境 if I18n.available_locales.include? country_sym I18n.locale = country_sym end end
要注意的是这不会在工作development和test环境,为喜欢的东西0.0.0.0和localhost有效有效的Internet IP地址。
Geocoder是非常强大和灵活的,但是需要进行配置以与地理编码服务一起使用(请参阅更多详细信息);其中许多限制使用。还需要牢记的是,对每个请求调用外部服务都可能影响性能。
为了解决这些问题,还值得考虑:
使用类似GeoIP(参见此处)的gem可以针对本地数据文件进行查找。在准确性方面可能需要权衡,因为这些数据文件需要保持最新。
通过CloudFlare服务的页面可以选择进行透明的地理编码,并且可以将国家/地区代码添加到页眉(HTTP_CF_IPCOUNTRY)中。可以在这里找到更多细节。