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