從 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
)。更多細節可以在這裡找到。